home *** CD-ROM | disk | FTP | other *** search
/ TOS Silver 2000 / TOS Silver 2000.iso / programm / MM2_DEV / S / GME / GMEKERNE.I < prev    next >
Encoding:
Text File  |  1991-03-09  |  64.8 KB  |  3 lines

  1. ⓪ IMPLEMENTATION MODULE GMEKernel;
  2. ⓪ 
  3. ⓪ (* !JL 11.12.90 - LCAP entfernt --> CAP
  4. ⓪$TT 14.12.90   "BlockMarkiert" neu (s.u.); Wenn Block falsch markiert
  5. ⓪2(Marke1 hinter Marke2), dann wird er weder invertiert
  6. ⓪2noch kopiert. "LoescheBlockMarken" in zwei Subroutines
  7. ⓪2aufgeteilt. "MarkiereBlockAnfang/Ende" setzen Block nur,
  8. ⓪2wenn Marken gültig sind.
  9. ⓪2"SetCharposToEndOfLine" als optimierte Subroutine.
  10. ⓪2Optimierungen in "MakeHighLine"
  11. ⓪ *)
  12. ⓪ 
  13. ⓪ (*$Y+,Z+,R-*)
  14. ⓪ 
  15. ⓪ (* Zusammenziehung von:
  16. ⓪#EditKernel, EditUtil, EditScreen.
  17. ⓪ *)
  18. ⓪ 
  19. ⓪ 
  20. ⓪ (********************* IMPLEMENTATION GMEKernel ************************)
  21. ⓪ 
  22. ⓪ (* FROM Storage IMPORT ALLOCATE; *)
  23. ⓪ FROM Granule IMPORT ALLOCATE;
  24. ⓪ 
  25. ⓪ FROM FastStrings IMPORT Assign, Append, Copy, Delete, Pos, Insert;
  26. ⓪ IMPORT Strings;
  27. ⓪ 
  28. ⓪ FROM SYSTEM IMPORT ADDRESS, ADR, CAST;
  29. ⓪ 
  30. ⓪ (* FROM MyConversions IMPORT CardToStr, StrToCard; *)
  31. ⓪ FROM Convert IMPORT ConvCard;
  32. ⓪ FROM StrConv IMPORT StrToCard;
  33. ⓪ 
  34. ⓪ FROM AESWindows IMPORT UpdateWindow, WindowRectList, firstElem, nextElem;
  35. ⓪ FROM VDIControls IMPORT SetClipping, DisableClipping;
  36. ⓪ FROM GrafBase IMPORT Rectangle;
  37. ⓪ 
  38. ⓪ FROM GMEBase IMPORT einBefehl, Befehlssatz,
  39. ⓪(PuffRecSize, cRevision, cZeile,
  40. ⓪(MausBusy, Nachricht,
  41. ⓪(GotoXY, LoescheZeile,
  42. ⓪(InitBuffer,
  43. ⓪(ScreenHandle, WindowHandle,
  44. ⓪(WriteConst, WriteChar, WriteLn, WriteLine, LinesOnScreen, backspace,
  45. ⓪(einButton, ButtonSet, MausPos, FrageJaNein, Ja, Nein,
  46. ⓪(cr, eot, tab, nul, escape, lineins, linedel, Trace,
  47. ⓪(GetDirectory, MausEin, CursorEin, CursorAus, HighLight, Normal,
  48. ⓪(GetVersion, InsertLn, DeleteLn, CharsInLine, MausAus,
  49. ⓪(DeleteTail, LoescheBild, LoescheEndeBild, WhereXY,
  50. ⓪(CharHeight, ScreenHeight, ScreenWidth, AutoCount,
  51. ⓪(einPufferPointer, MerkIndex,
  52. ⓪(eineZeile, eineInfo, einLinePointer, aLine,
  53. ⓪(einMerkPointer, Mode, Moden,
  54. ⓪(einMerkPunkt,
  55. ⓪(CharSet,
  56. ⓪(Init, GetLine, PutLine, Loeschen,
  57. ⓪(DeAllocLine, AllocLine,
  58. ⓪(undone, InsertPuffer, PuffInit,
  59. ⓪(UndoPuffer,
  60. ⓪(ClipBoard,
  61. ⓪(HilfsPuffer,
  62. ⓪(ConfigPuffer,
  63. ⓪(EditPuffer,
  64. ⓪(AlternEdit,
  65. ⓪(DruckPuff,
  66. ⓪(FehlerPuffer,
  67. ⓪(MailPuffer,
  68. ⓪(GolemPuffer,
  69. ⓪(SendePuffer,
  70. ⓪(Tausch,
  71. ⓪(PSCPuffer,
  72. ⓪(LoadPuffer,
  73. ⓪(DruckerBatch,
  74. ⓪((*TextVergleich,*) (* Namenskonflikt! *)
  75. ⓪(WaehlPuffer,
  76. ⓪(StartPuffer,
  77. ⓪(Puffer1, Puffer2,
  78. ⓪(Puffer3, Puffer4;
  79. ⓪ 
  80. ⓪ (********************** EditUtil ***************************)
  81. ⓪ 
  82. ⓪ FROM GMEConfig IMPORT einTasteneintrag, LoescheQueue, LiesZeichen,
  83. ⓪"TasteBereit, LiesTaste, einTastenTyp;
  84. ⓪ 
  85. ⓪ 
  86. ⓪ (***************************** EditScreen *************************)
  87. ⓪ (*
  88. ⓪ FROM EditKernel IMPORT SucheZeilenNummer;
  89. ⓪ *)
  90. ⓪ 
  91. ⓪ 
  92. ⓪ 
  93. ⓪ (************************* EditKernel *******************************)
  94. ⓪ 
  95. ⓪ CONST   PhantomTrenn =  37C;
  96. ⓪ 
  97. ⓪ (*VAR     ok:             BOOLEAN;*)
  98. ⓪ 
  99. ⓪ PROCEDURE DoBackspace (Puff: einPufferPointer);
  100. ⓪ VAR     string:         eineZeile;
  101. ⓪(merkZeile1:     CARDINAL;
  102. ⓪(dummyC:         CARDINAL;
  103. ⓪(returnX:        CARDINAL;
  104. ⓪ BEGIN
  105. ⓪"WITH Puff^ DO
  106. ⓪$IF MerkPunkte [LaufendeZeile].merkline^.vorige # Puffer THEN
  107. ⓪&MerkPunkte [LaufendeZeile].charpos :=
  108. ⓪(LENGTH (MerkPunkte [LaufendeZeile].merkline^.vorige^.ZeilPointer^);
  109. ⓪&IF (MerkPunkte [LaufendeZeile].charpos +
  110. ⓪'LENGTH (MerkPunkte [LaufendeZeile].merkline^.ZeilPointer^)) <= Max THEN
  111. ⓪(GetLine (MerkPunkte [LaufendeZeile].merkline^.vorige, string);
  112. ⓪(Append (MerkPunkte [LaufendeZeile].merkline^.ZeilPointer^, string);
  113. ⓪(PutLine (MerkPunkte [LaufendeZeile].merkline^.vorige, string);
  114. ⓪(DeleteLine (Puff, MerkPunkte [LaufendeZeile].merkline, TRUE, FALSE);
  115. ⓪((* IF MerkPunkte [LaufendeZeile].merkline^.naechste # NIL THEN *)
  116. ⓪*LineUp (Puff);
  117. ⓪((* END (* IF nicht schon letzte Zeile - LineUp durch DeleteLine *); *)
  118. ⓪(CursorAus;
  119. ⓪(GotoXY (0, MerkPunkte [LaufendeZeile].zeilpos -
  120. ⓪3MerkPunkte [ErsteZeile].zeilpos);
  121. ⓪(WriteString (MerkPunkte [ErsteZeile].charpos,
  122. ⓪5(*ControlZeichen IN Modus, TabFiltern IN Modus,*)
  123. ⓪5MerkPunkte [LaufendeZeile].merkline^.ZeilPointer^);
  124. ⓪&ELSE LineUp (Puff);
  125. ⓪&END (* IF Laenge der beiden Zeilen... *);
  126. ⓪$END (* IF *);
  127. ⓪"END (* WITH *);
  128. ⓪ END DoBackspace;
  129. ⓪ 
  130. ⓪ PROCEDURE DoDelete (Puff: einPufferPointer);
  131. ⓪ VAR     string:         eineZeile;
  132. ⓪(letzte:         BOOLEAN;
  133. ⓪(merkZeile1:     CARDINAL;
  134. ⓪(dummyC:         CARDINAL;
  135. ⓪(returnX:        CARDINAL;
  136. ⓪ BEGIN
  137. ⓪"WITH Puff^ DO
  138. ⓪$IF MerkPunkte [LaufendeZeile].merkline^.naechste # NIL THEN
  139. ⓪&IF (LENGTH (MerkPunkte [LaufendeZeile].merkline^.ZeilPointer^) +
  140. ⓪*LENGTH (MerkPunkte [LaufendeZeile].merkline^.naechste^.ZeilPointer^))
  141. ⓪+<= Max THEN
  142. ⓪(GetLine (MerkPunkte [LaufendeZeile].merkline, string);
  143. ⓪(Append (MerkPunkte [LaufendeZeile].merkline^.naechste^.ZeilPointer^,
  144. ⓪0string);
  145. ⓪(PutLine (MerkPunkte [LaufendeZeile].merkline, string);
  146. ⓪(LineDown (Puff);
  147. ⓪((* letzte := MerkPunkte [LaufendeZeile].merkline^.naechste = NIL; *)
  148. ⓪(DeleteLine (Puff, MerkPunkte [LaufendeZeile].merkline, TRUE, FALSE);
  149. ⓪(LineUp (Puff);
  150. ⓪(CursorAus;
  151. ⓪(GotoXY (0, MerkPunkte [LaufendeZeile].zeilpos - MerkPunkte [ErsteZeile].zeilpos);
  152. ⓪(WriteString (MerkPunkte [ErsteZeile].charpos,
  153. ⓪5(*ControlZeichen IN Modus, TabFiltern IN Modus,*)
  154. ⓪5MerkPunkte [LaufendeZeile].merkline^.ZeilPointer^);
  155. ⓪&END (* IF Laenge der beiden Zeilen... *);
  156. ⓪$END (* IF *);
  157. ⓪"END (* WITH *);
  158. ⓪ END DoDelete;
  159. ⓪ 
  160. ⓪ PROCEDURE DoCR (Puff: einPufferPointer; zeigen: BOOLEAN;
  161. ⓪0VAR returnX: CARDINAL);
  162. ⓪ VAR     string:         eineZeile;
  163. ⓪(PufZeile:       eineZeile;
  164. ⓪((*$Reg*)l:              CARDINAL;
  165. ⓪ BEGIN
  166. ⓪"WITH Puff^ DO
  167. ⓪ 
  168. ⓪$IF OverWrite IN Modus THEN
  169. ⓪&IF MerkPunkte [LaufendeZeile].merkline^.naechste = NIL THEN
  170. ⓪(InsertLine (Puff, '', AutoIndent IN Modus, zeigen, TRUE);
  171. ⓪&END (* IF *);
  172. ⓪&(* Nun gibt es auf jeden Fall eine nächste Zeile *)
  173. ⓪ 
  174. ⓪&WITH MerkPunkte [LaufendeZeile] DO
  175. ⓪(charpos := 0;
  176. ⓪&(* Wir prüfen nun ggf., wie weit die alte Zeile eingerückt war: *)
  177. ⓪(IF (AutoIndent IN Modus) THEN
  178. ⓪*WHILE merkline^.ZeilPointer^[charpos] IN CharSet {' ', tab} DO
  179. ⓪,INC (charpos);
  180. ⓪*END (* WHILE *);
  181. ⓪(END (* IF AutoIndent *);
  182. ⓪&END (* WITH *);
  183. ⓪ 
  184. ⓪&(* Nun zur nächsten (neuen) Zeile: *)
  185. ⓪&LineDown (Puff);
  186. ⓪&
  187. ⓪&IF (AutoIndent IN Modus) THEN
  188. ⓪(WITH MerkPunkte [LaufendeZeile] DO
  189. ⓪*(* Falls neue Zeile für Einrückung zu kurz, fülle sie auf: *)
  190. ⓪*l := LENGTH (merkline^.ZeilPointer^);
  191. ⓪*WHILE l < charpos DO
  192. ⓪,merkline^.ZeilPointer^[l] :=
  193. ⓪.merkline^.vorige^.ZeilPointer^[l];
  194. ⓪,INC (l);
  195. ⓪*END (* WHILE *);
  196. ⓪*merkline^.ZeilPointer^[l] := nul;
  197. ⓪"
  198. ⓪*(* Vielleicht war die neue Zeile aber schon weiter eingerückt: *)
  199. ⓪*WHILE merkline^.ZeilPointer^[charpos] IN CharSet {' ', tab} DO
  200. ⓪,INC (charpos);
  201. ⓪*END (* WHILE *);
  202. ⓪*
  203. ⓪*(* Oder sie ist weniger eingerückt: *)
  204. ⓪*WHILE (charpos > 0) & ~(merkline^.ZeilPointer^[charpos-1] IN
  205. ⓪ACharSet {' ', tab}) DO
  206. ⓪,DEC (charpos);
  207. ⓪*END (* WHILE *);
  208. ⓪(END (* WITH *);
  209. ⓪&END (* IF AutoIndent *);
  210. ⓪$ELSE (* nicht OverWrite *)
  211. ⓪&INCL (Modus, Editiert);
  212. ⓪&IF zeigen THEN
  213. ⓪(CursorAus;
  214. ⓪(GotoXY (MerkPunkte [LaufendeZeile].charpos -
  215. ⓪*MerkPunkte [ErsteZeile].charpos,
  216. ⓪*MerkPunkte [LaufendeZeile].zeilpos -
  217. ⓪,MerkPunkte [ErsteZeile].zeilpos);
  218. ⓪0(* SchirmZeile); *)
  219. ⓪(LoescheZeile;
  220. ⓪/(* Zeilenrest auf Bildschirm geloescht *)
  221. ⓪&END (* IF zeigen *);
  222. ⓪ 
  223. ⓪&returnX := MerkPunkte [LaufendeZeile].charpos;
  224. ⓪-(* Rest d. Zeile nach Cursor loeschen: *)
  225. ⓪&l := LENGTH (MerkPunkte [LaufendeZeile].merkline^.ZeilPointer^);
  226. ⓪&IF returnX < l THEN
  227. ⓪(Copy (MerkPunkte [LaufendeZeile].merkline^.ZeilPointer^, returnX,
  228. ⓪.l - returnX, PufZeile);
  229. ⓪&ELSE PufZeile [0] := nul;
  230. ⓪&END (* IF *);
  231. ⓪$
  232. ⓪,(* Neue Zeile mit gepuffertem Rest einfuegen: *)
  233. ⓪&InsertLine (Puff, PufZeile, AutoIndent IN Modus, zeigen, TRUE);
  234. ⓪,(* Rest in der alten Zeile loeschen: *)
  235. ⓪&GetLine (MerkPunkte [LaufendeZeile].merkline^.vorige, PufZeile);
  236. ⓪&Delete (PufZeile, returnX,
  237. ⓪.LENGTH (MerkPunkte [LaufendeZeile].merkline^.vorige^.ZeilPointer^)
  238. ⓪.- returnX);
  239. ⓪&PutLine (MerkPunkte [LaufendeZeile].merkline^.vorige, PufZeile);
  240. ⓪ 
  241. ⓪&IF ~(AutoIndent IN Modus) THEN MerkPunkte [LaufendeZeile].charpos := 0;
  242. ⓪&END (* IF *);
  243. ⓪$END (* IF OverWrite *);
  244. ⓪"END (* WITH Puff *);
  245. ⓪ END DoCR;
  246. ⓪ 
  247. ⓪ PROCEDURE ScrollUp (Puff: einPufferPointer; z: CARDINAL);
  248. ⓪ VAR     (*$Reg*)i, (*$Reg*)j:           CARDINAL;
  249. ⓪((*$Reg*)Help:           einLinePointer;
  250. ⓪((*$Reg*)zeile:          CARDINAL;
  251. ⓪ BEGIN
  252. ⓪"WITH Puff^ DO
  253. ⓪$zeile := MerkPunkte [ErsteZeile].zeilpos + 1;
  254. ⓪$CursorAus;
  255. ⓪$j := 1;
  256. ⓪$WHILE j <= z DO
  257. ⓪&WITH MerkPunkte [ErsteZeile] DO
  258. ⓪(IF (merkline^.naechste # NIL) &
  259. ⓪+(zeilpos + LinesOnScreen < ZeilenAnzahl) THEN
  260. ⓪*DeleteZeile (Puff, zeilpos + 1); (* oberste Zeile loeschen *)
  261. ⓪;(* DeleteZeile subtrahiert global y! *)
  262. ⓪*merkline := merkline^.naechste;
  263. ⓪*INC (zeilpos); (* global y! Basis erhoehen *)
  264. ⓪*INC (zeile);
  265. ⓪ 
  266. ⓪*(* Unterste Zeile neu schreiben: *)
  267. ⓪*i := 1; Help := MerkPunkte [ErsteZeile].merkline;
  268. ⓪*WHILE (i < LinesOnScreen) & (Help^.naechste # NIL) DO
  269. ⓪,INC (i); Help := Help^.naechste; (* unterste Zeile suchen *)
  270. ⓪,INC (zeile);
  271. ⓪*END (* WHILE *);
  272. ⓪*GotoXY (0, i + 1);
  273. ⓪*MakeHighLine (Puff, (*ControlZeichen IN Modus, TabFiltern IN Modus,*)
  274. ⓪8zeile, Help^.ZeilPointer^);
  275. ⓪ 
  276. ⓪(ELSE j := z;
  277. ⓪(END (* IF *);
  278. ⓪(INC (j);
  279. ⓪&END (* WITH ErsteZeile *);
  280. ⓪$END (* WHILE *);
  281. ⓪$CursorEin;
  282. ⓪ 
  283. ⓪$(* Laufende Zeile oberhalb Fenster? *)
  284. ⓪$WHILE (MerkPunkte [LaufendeZeile].zeilpos < MerkPunkte [ErsteZeile].zeilpos + 1) DO
  285. ⓪&INC (MerkPunkte [LaufendeZeile].zeilpos);
  286. ⓪&MerkPunkte [LaufendeZeile].merkline := MerkPunkte [LaufendeZeile].merkline^.naechste;
  287. ⓪$END (* WHILE *);
  288. ⓪"END (* WITH *);
  289. ⓪ END ScrollUp;
  290. ⓪ 
  291. ⓪ PROCEDURE ScrollDown (Puff: einPufferPointer; z: CARDINAL);
  292. ⓪ VAR     (*$Reg*)i, (*$Reg*)j:           CARDINAL;
  293. ⓪((*$Reg*)zeile:          CARDINAL;
  294. ⓪((*$Reg*)Help:           einLinePointer;
  295. ⓪ BEGIN
  296. ⓪"WITH Puff^ DO
  297. ⓪$CursorAus;
  298. ⓪$zeile := MerkPunkte [ErsteZeile].zeilpos + 1;
  299. ⓪$j := 1;
  300. ⓪$WHILE j <= z DO
  301. ⓪&WITH MerkPunkte [ErsteZeile] DO
  302. ⓪(IF merkline^.vorige # Puffer THEN
  303. ⓪*InsertZeile (Puff, zeilpos + 1);
  304. ⓪;(* oben Zeile einfuegen *)
  305. ⓪;(* Achtung: InsertZeile subtrahiert den
  306. ⓪>Offset global y *)
  307. ⓪*merkline := merkline^.vorige;
  308. ⓪*DEC (zeilpos); (* Offset erniedrigen *)
  309. ⓪*DEC (zeile);
  310. ⓪(ELSE
  311. ⓪*j := z;
  312. ⓪(END (* IF *);
  313. ⓪&END;
  314. ⓪&
  315. ⓪&(* oberste Zeile neu schreiben: *)
  316. ⓪&GotoXY (0, 1);
  317. ⓪&MakeHighLine (Puff, (*ControlZeichen IN Modus, TabFiltern IN Modus,*)
  318. ⓪4zeile, MerkPunkte [ErsteZeile].merkline^.ZeilPointer^);
  319. ⓪&INC (j);
  320. ⓪$END (* WHILE *);
  321. ⓪$CursorEin;
  322. ⓪ 
  323. ⓪$(* Laufende Zeile unterhalb Fenster? *)
  324. ⓪$WHILE (MerkPunkte [LaufendeZeile].zeilpos >
  325. ⓪+MerkPunkte [ErsteZeile].zeilpos + LinesOnScreen) DO
  326. ⓪&DEC (MerkPunkte [LaufendeZeile].zeilpos);
  327. ⓪&MerkPunkte [LaufendeZeile].merkline :=
  328. ⓪(MerkPunkte [LaufendeZeile].merkline^.vorige;
  329. ⓪$END (* WHILE *);
  330. ⓪"END (* WITH *);
  331. ⓪ END ScrollDown;
  332. ⓪ 
  333. ⓪ PROCEDURE InsertLine (Puff: einPufferPointer;
  334. ⓪6REF z: ARRAY OF CHAR;
  335. ⓪6Indent: BOOLEAN;
  336. ⓪6zeigen: BOOLEAN;
  337. ⓪6adjustMerkpunkte: BOOLEAN);
  338. ⓪ VAR       Help:                         einLinePointer;
  339. ⓪*stopx, i:                     CARDINAL;
  340. ⓪*Zlaenge, IndentLaenge:        CARDINAL;
  341. ⓪*(* Verwendet globales x bei Auto-Indent *)
  342. ⓪*merkIndex:                    MerkIndex;
  343. ⓪*MerkPointer:                  einMerkPointer;
  344. ⓪ 
  345. ⓪ (* Haengt an die laufende Zeile eine Zeile mit Inhalt z an *)
  346. ⓪ BEGIN (* InsertLine *)
  347. ⓪"WITH Puff^ DO
  348. ⓪$Help := MerkPunkte [LaufendeZeile].merkline; (* Wir merken die alte Zeile *)
  349. ⓪$Zlaenge := LENGTH (z) + 1;
  350. ⓪$IF Indent THEN
  351. ⓪&WITH MerkPunkte [LaufendeZeile] DO
  352. ⓪(stopx := charpos;
  353. ⓪(charpos := 0;  (* Vorbereitung fuer automatisch einruecken: *)
  354. ⓪(WITH Help^ DO
  355. ⓪*WHILE ((Zlaenge + charpos < cZeile) &
  356. ⓪1(* (Help^.ZeilPointer^ [charpos] IN CharSet {' ', tab}) & *)
  357. ⓪1((ZeilPointer^ [charpos] = ' ') OR
  358. ⓪2(ZeilPointer^ [charpos] = tab)) &
  359. ⓪1(charpos < stopx)) DO
  360. ⓪,INC (charpos); (* Cursorposition erhoehen *)
  361. ⓪*END (* WHILE *);
  362. ⓪(END (* WITH *);
  363. ⓪(IndentLaenge := charpos; (* Das ist der Index, bis zu dem Einrueck-
  364. ⓪Dzeichen wie Blank oder Tab kopiert werden *)
  365. ⓪&END (* WITH *);
  366. ⓪$ELSE IndentLaenge := 0;
  367. ⓪$END (* IF Indent *);
  368. ⓪$DEC (Zlaenge);
  369. ⓪$(* Zlaenge ist die Laenge von z *)
  370. ⓪$(* IndentLaenge ist die Laenge der Einrückung *)
  371. ⓪ 
  372. ⓪$AllocLine (MerkPunkte [LaufendeZeile].merkline, Zlaenge + IndentLaenge);
  373. ⓪$(* Wir haben eine neue Zeile erzeugt *)
  374. ⓪$IF MerkPunkte [LaufendeZeile].merkline # NIL THEN
  375. ⓪&(* PutLine (MerkPunkte [LaufendeZeile].merkline, Zeile); *)
  376. ⓪&WITH MerkPunkte [LaufendeZeile].merkline^ DO
  377. ⓪(IF IndentLaenge > 0 THEN
  378. ⓪*FOR i := 0 TO IndentLaenge - 1 DO
  379. ⓪,ZeilPointer^[i] := Help^.ZeilPointer^ [i]; (* Kopieren der Einrueckzeichen *)
  380. ⓪*END (* FOR *);
  381. ⓪(END (* IF *);
  382. ⓪(IF Zlaenge > 0 THEN
  383. ⓪*FOR i := 0 TO Zlaenge - 1 DO
  384. ⓪,ZeilPointer^[IndentLaenge] := z [i]; INC (IndentLaenge); (* Index auf Gesamtlaenge *)
  385. ⓪,(* Kopieren der Zeichen in der Zeile, die eingefügt wird *)
  386. ⓪*END;
  387. ⓪(END (* IF *);
  388. ⓪(ZeilPointer^[IndentLaenge] := nul;
  389. ⓪(
  390. ⓪(vorige := Help;             (* Die alte Zeile wird Vorgaenger *)
  391. ⓪(naechste := Help^.naechste; (* alte naechste unten anhaengen *)
  392. ⓪&END (* WITH LaufendeZeile *);
  393. ⓪&IF Help^.naechste # NIL
  394. ⓪(THEN Help^.naechste^.vorige := MerkPunkte [LaufendeZeile].merkline;
  395. ⓪&END (* IF *);
  396. ⓪&Help^.naechste := MerkPunkte [LaufendeZeile].merkline; (* neue Zeile eingehaengt *)
  397. ⓪&INC (MerkPunkte [LaufendeZeile].zeilpos);
  398. ⓪&INC (ZeilenAnzahl); (* Zeilenzaehler erhoehen *)
  399. ⓪ 
  400. ⓪&IF adjustMerkpunkte THEN
  401. ⓪(FOR merkIndex := MerkPunkt1 TO LetztePosition DO
  402. ⓪*WITH MerkPunkte [merkIndex] DO
  403. ⓪,IF MerkPunkte [LaufendeZeile].zeilpos <= zeilpos THEN INC (zeilpos);
  404. ⓪,END;
  405. ⓪*END (* WITH *);
  406. ⓪(END (* FOR *);
  407. ⓪&END (* IF adjustMerkpunkte *);
  408. ⓪&IF zeigen THEN
  409. ⓪(IF (MerkPunkte [LaufendeZeile].zeilpos - MerkPunkte [ErsteZeile].zeilpos
  410. ⓪,> LinesOnScreen) THEN
  411. ⓪*ScrollUp (Puff, 1);
  412. ⓪(END (* IF *);
  413. ⓪(InsertZeile (Puff, MerkPunkte [LaufendeZeile].zeilpos);
  414. ⓪(WriteString (MerkPunkte [ErsteZeile].charpos,
  415. ⓪5(*ControlZeichen IN Modus, TabFiltern IN Modus,*)
  416. ⓪5MerkPunkte [LaufendeZeile].merkline^.ZeilPointer^);
  417. ⓪&END (* IF *);
  418. ⓪$ELSE MerkPunkte [LaufendeZeile].merkline := Help;
  419. ⓪$END (* IF neue Zeile *);
  420. ⓪"END (* WITH *);
  421. ⓪ END InsertLine;
  422. ⓪ 
  423. ⓪ PROCEDURE DeleteLine (Puff: einPufferPointer;
  424. ⓪6VAR LoeschZeile: einLinePointer;
  425. ⓪6zeigen, puffern: BOOLEAN);
  426. ⓪ VAR       Help:         einLinePointer;
  427. ⓪*i, zeile:     CARDINAL;
  428. ⓪*merkIndex:    MerkIndex;
  429. ⓪*MerkPointer:  einMerkPointer;
  430. ⓪*LoeschPos:    CARDINAL;
  431. ⓪*l:            CARDINAL;
  432. ⓪*PufZeile:     eineZeile;
  433. ⓪*LeerString:   ARRAY [0..0] OF CHAR;
  434. ⓪ 
  435. ⓪"(* ACHTUNG: WARNUNG: DeleteLine l ö s c h t  N I C H T die LaufendeZeile,
  436. ⓪%sondern die durch LoeschZeile bezeichnete Zeile!!!!!!!!!!!!!
  437. ⓪%>>zeigen<< funktioniert nicht korrekt, wenn LoeschZeile nicht mit
  438. ⓪%LaufenderZeile identisch!!!
  439. ⓪"*)
  440. ⓪!
  441. ⓪ BEGIN (* DeleteLine *)
  442. ⓪"LeerString := '';
  443. ⓪"WITH Puff^ DO
  444. ⓪$IF Puffer^.naechste^.naechste = NIL THEN
  445. ⓪$(* Sonderfall: Es gibt nur eine Zeile, diese darf nicht verschwinden.
  446. ⓪'Daher wird eine Ersatzzeile eingefügt. Diese wird jedoch
  447. ⓪'die zweite Zeile (die weiter unten dann hochgezogen wird) *)
  448. ⓪&InsertLine (Puff, LeerString, FALSE, zeigen, FALSE);
  449. ⓪$(* Rückstellung auf die ursprüngliche Zeile: *)
  450. ⓪&LineUp (Puff);
  451. ⓪$END (* IF nur eine Zeile vorhanden *);
  452. ⓪"
  453. ⓪$SucheZeilenNummer (Puff, LoeschZeile, LoeschPos);
  454. ⓪$(* Pruefen und ggf. Updaten der Merker: *)
  455. ⓪$FOR merkIndex := MerkPunkt1 TO LetztePosition DO
  456. ⓪&WITH MerkPunkte [merkIndex] DO
  457. ⓪(IF LoeschPos < zeilpos THEN DEC (zeilpos);
  458. ⓪(ELSIF (LoeschPos = zeilpos) &
  459. ⓪.(LoeschZeile^.naechste # NIL) THEN
  460. ⓪*merkline := LoeschZeile^.naechste;
  461. ⓪*l := LENGTH (merkline^.ZeilPointer^);
  462. ⓪*IF charpos > l THEN
  463. ⓪,charpos := l;
  464. ⓪*END (* IF *);
  465. ⓪(ELSIF LoeschPos = zeilpos THEN
  466. ⓪*merkline := LoeschZeile^.vorige;
  467. ⓪*l := LENGTH (merkline^.ZeilPointer^);
  468. ⓪*IF charpos > l THEN
  469. ⓪,charpos := l;
  470. ⓪*END (* IF *);
  471. ⓪(END (* IF *);
  472. ⓪&END (* WITH *);
  473. ⓪$END (* FOR merkindex *);
  474. ⓪$
  475. ⓪$(* Zeileninhalt merken: *)
  476. ⓪$IF puffern THEN
  477. ⓪&GetLine (LoeschZeile, PufZeile);
  478. ⓪&IF (UndoPuffer^.Puffer^.naechste^.naechste = NIL) &
  479. ⓪)(UndoPuffer^.Puffer^.naechste^.ZeilPointer^[0] = nul) THEN
  480. ⓪(PutLine (UndoPuffer^.Puffer^.naechste, PufZeile);
  481. ⓪&ELSE InsertLine (UndoPuffer, PufZeile, FALSE, FALSE, TRUE);
  482. ⓪&END (* IF Undopuffer leer *);
  483. ⓪$END (* IF puffern *);
  484. ⓪$Help := LoeschZeile^.vorige;         (* Vorige Zeile gemerkt *)
  485. ⓪@(* Achtung: Kann Puffer sein *)
  486. ⓪$IF LoeschZeile^.naechste # NIL THEN
  487. ⓪&Help^.naechste := LoeschZeile^.naechste;
  488. ⓪&LoeschZeile^.naechste^.vorige := Help;
  489. ⓪((* Laufende Zeile ausgehaengt *)
  490. ⓪&IF MerkPunkte [ErsteZeile].merkline = LoeschZeile THEN
  491. ⓪(MerkPunkte [ErsteZeile].merkline := LoeschZeile^.naechste;
  492. ⓪&END (* IF *);
  493. ⓪&DeAllocLine (LoeschZeile);
  494. ⓪3(* Laufende Zeile geloescht *)
  495. ⓪&IF zeigen THEN DeleteZeile (Puff, MerkPunkte [LaufendeZeile].zeilpos);
  496. ⓪2(* Zeile auf Bildschirm geloescht *)
  497. ⓪&END (* IF *);
  498. ⓪&LoeschZeile := Help^.naechste;
  499. ⓪&IF zeigen THEN
  500. ⓪(i := 1; Help := MerkPunkte [ErsteZeile].merkline;
  501. ⓪(zeile := MerkPunkte [ErsteZeile].zeilpos + 1;
  502. ⓪((* Unterste Zeile neu schreiben *)
  503. ⓪(WHILE (i < LinesOnScreen) & (Help^.naechste # NIL) DO
  504. ⓪*INC (i); Help := Help^.naechste; INC (zeile);
  505. ⓪(END (* WHILE *);
  506. ⓪(CursorAus; GotoXY (0, i);
  507. ⓪(MakeHighLine (Puff, (*ControlZeichen IN Modus, TabFiltern IN Modus,*)
  508. ⓪6zeile, Help^.ZeilPointer^);
  509. ⓪&END (* IF zeigen *);
  510. ⓪&DEC (ZeilenAnzahl);
  511. ⓪$ELSE (* Wir stehen in der letzten Zeile *)
  512. ⓪&IF zeigen THEN
  513. ⓪(GotoXY (0, MerkPunkte [LaufendeZeile].zeilpos  -
  514. ⓪3MerkPunkte [ErsteZeile].zeilpos);
  515. ⓪(LoescheZeile;
  516. ⓪&END (* IF zeigen *);
  517. ⓪&
  518. ⓪&GetLine (LoeschZeile, PufZeile);
  519. ⓪&PufZeile [0] := CHR (0);
  520. ⓪&PutLine (LoeschZeile, PufZeile);
  521. ⓪$END (* IF letzte Zeile *);
  522. ⓪"END (* WITH *);
  523. ⓪ END DeleteLine;
  524. ⓪ 
  525. ⓪ PROCEDURE LineUp (Puff: einPufferPointer);
  526. ⓪ BEGIN
  527. ⓪"WITH Puff^ DO
  528. ⓪$WITH MerkPunkte [LaufendeZeile] DO
  529. ⓪&IF merkline^.vorige # Puffer THEN
  530. ⓪(merkline :=
  531. ⓪*merkline^.vorige;
  532. ⓪(DEC (zeilpos);
  533. ⓪(IF MerkPunkte [ErsteZeile].zeilpos + 1 > zeilpos THEN
  534. ⓪*ScrollDown (Puff, 1);
  535. ⓪(END (* IF *);
  536. ⓪&END (* IF *);
  537. ⓪$END (* WITH *);
  538. ⓪"END (* WITH *);
  539. ⓪ END LineUp;
  540. ⓪ 
  541. ⓪ PROCEDURE LineDown (Puff: einPufferPointer);
  542. ⓪ BEGIN
  543. ⓪"WITH Puff^ DO
  544. ⓪$WITH MerkPunkte [LaufendeZeile] DO
  545. ⓪&IF merkline^.naechste # NIL THEN
  546. ⓪(merkline := merkline^.naechste;
  547. ⓪(INC (zeilpos);
  548. ⓪(IF zeilpos - MerkPunkte [ErsteZeile].zeilpos > LinesOnScreen THEN
  549. ⓪*ScrollUp (Puff, 1);
  550. ⓪(END (* IF *);
  551. ⓪&END (* IF *);
  552. ⓪$END (* WITH *);
  553. ⓪"END (* WITH *);
  554. ⓪ END LineDown;
  555. ⓪ 
  556. ⓪ PROCEDURE SucheZeilenPointer (Puff: einPufferPointer;
  557. ⓪>VAR Nummer: CARDINAL;
  558. ⓪>VAR Zeile: einLinePointer);
  559. ⓪ VAR     (*$Reg*) n, (*$Reg*) nummer: CARDINAL;
  560. ⓪((*$Reg*) zl: einLinePointer;
  561. ⓪ BEGIN
  562. ⓪"nummer:= Nummer;
  563. ⓪"WITH Puff^ DO
  564. ⓪$zl:= Puffer^.naechste;
  565. ⓪$n := 1;
  566. ⓪$WHILE (zl^.naechste # NIL) & (n < nummer) DO
  567. ⓪&zl:= zl^.naechste;
  568. ⓪&INC (n);
  569. ⓪$END (* WHILE *);
  570. ⓪"END (* WITH *);
  571. ⓪"Zeile:= zl;
  572. ⓪"Nummer := n;
  573. ⓪ END SucheZeilenPointer;
  574. ⓪ 
  575. ⓪ PROCEDURE StellePointerEin (Puff: einPufferPointer;
  576. ⓪@l: einLinePointer;
  577. ⓪@offset: CARDINAL);
  578. ⓪ BEGIN
  579. ⓪"IF offset > LinesOnScreen THEN offset := LinesOnScreen; END;
  580. ⓪"WITH Puff^ DO
  581. ⓪$SucheZeilenNummer (Puff, l, MerkPunkte [LaufendeZeile].zeilpos);
  582. ⓪$MerkPunkte [LaufendeZeile].merkline := l; (* Tatsaechlich gef. Zeilenpointer *)
  583. ⓪$MerkPunkte [ErsteZeile].merkline := MerkPunkte [LaufendeZeile].merkline;
  584. ⓪$MerkPunkte [ErsteZeile].zeilpos := MerkPunkte [LaufendeZeile].zeilpos - 1;
  585. ⓪$WHILE (MerkPunkte [ErsteZeile].merkline^.vorige # Puffer) &
  586. ⓪*((MerkPunkte [ErsteZeile].zeilpos + offset) >
  587. ⓪,MerkPunkte [LaufendeZeile].zeilpos) DO
  588. ⓪&MerkPunkte [ErsteZeile].merkline :=
  589. ⓪(MerkPunkte [ErsteZeile].merkline^.vorige;
  590. ⓪&DEC (MerkPunkte [ErsteZeile].zeilpos);
  591. ⓪$END (* WHILE *);
  592. ⓪"END (* WITH *);
  593. ⓪ END StellePointerEin;
  594. ⓪ 
  595. ⓪ PROCEDURE StelleZeileEin (Puff: einPufferPointer;
  596. ⓪6n, offset: CARDINAL);
  597. ⓪ BEGIN
  598. ⓪"IF offset > LinesOnScreen THEN offset := LinesOnScreen; END;
  599. ⓪"WITH Puff^ DO
  600. ⓪$SucheZeilenPointer (Puff, n, MerkPunkte [LaufendeZeile].merkline);
  601. ⓪$MerkPunkte [LaufendeZeile].zeilpos := n; (* Tatsaechlich gef. Zeilennummer *)
  602. ⓪$MerkPunkte [ErsteZeile].merkline := MerkPunkte [LaufendeZeile].merkline;
  603. ⓪$MerkPunkte [ErsteZeile].zeilpos := MerkPunkte [LaufendeZeile].zeilpos - 1;
  604. ⓪$WHILE (MerkPunkte [ErsteZeile].merkline^.vorige # Puffer) &
  605. ⓪*((MerkPunkte [ErsteZeile].zeilpos + offset) >
  606. ⓪,MerkPunkte [LaufendeZeile].zeilpos) DO
  607. ⓪&MerkPunkte [ErsteZeile].merkline :=
  608. ⓪(MerkPunkte [ErsteZeile].merkline^.vorige;
  609. ⓪&DEC (MerkPunkte [ErsteZeile].zeilpos);
  610. ⓪$END (* WHILE *);
  611. ⓪"END (* WITH *);
  612. ⓪ END StelleZeileEin;
  613. ⓪ 
  614. ⓪ PROCEDURE SucheZeilenNummer (Puff: einPufferPointer;
  615. ⓪=Zeile: einLinePointer;
  616. ⓪=VAR Nummer: CARDINAL);
  617. ⓪"(* Nummer der Zeile mit Zeiger Zeile ermitteln *)
  618. ⓪ VAR     z:      einLinePointer;
  619. ⓪ BEGIN
  620. ⓪"z := Puff^.Puffer^.naechste;
  621. ⓪"Nummer := 1;
  622. ⓪"WHILE (z^.naechste # NIL) & (z # Zeile) DO
  623. ⓪$z := z^.naechste; INC (Nummer);
  624. ⓪"END (* WHILE *);
  625. ⓪"IF z # Zeile THEN Nummer := 1; END;
  626. ⓪ END SucheZeilenNummer;
  627. ⓪ 
  628. ⓪ (* Ende von EditKernel *)
  629. ⓪ 
  630. ⓪ (******************************* EditUtil *******************************)
  631. ⓪ 
  632. ⓪ (* Diese Konstante soll ein Parameter CharSet werden - am besten
  633. ⓪#als Bestandteil des PufferDeskriptors: TrennSet: CharSet; *)
  634. ⓪ CONST   TrennSet =      CharSet {0C..' ', '!', '"', '%', '/', '&',
  635. ⓪*'(', ')', '=', '?', "'", '`', '#', '^', '@', '\', '+', '*',
  636. ⓪*'[', ']', '{', '}', '<', '>', ',', ';', '.', ':', '-', '_',
  637. ⓪*'~', '|', '»', '«'};
  638. ⓪ 
  639. ⓪ PROCEDURE GetKey (zeile: CARDINAL;
  640. ⓪2info: ARRAY OF CHAR;
  641. ⓪2set: CharSet;
  642. ⓪2VAR ch: CHAR);
  643. ⓪ VAR     cch:    CHAR;
  644. ⓪ BEGIN
  645. ⓪"GotoXY (0, zeile);
  646. ⓪"LoescheZeile; HighLight; WriteConst (info); Normal;
  647. ⓪"REPEAT
  648. ⓪$LiesZeichen (cch);
  649. ⓪$IF cch # nul THEN ch := CAP (cch); END;
  650. ⓪"UNTIL ch IN set;
  651. ⓪"WriteChar (ch);
  652. ⓪ END GetKey;
  653. ⓪ 
  654. ⓪ PROCEDURE ReadNum (zeile: CARDINAL; REF info: ARRAY OF CHAR; VAR n: CARDINAL);
  655. ⓪ VAR     s:      eineInfo;
  656. ⓪(ok:     BOOLEAN;
  657. ⓪(m:      CARDINAL;
  658. ⓪(d:      einTasteneintrag;
  659. ⓪(pos:    CARDINAL;
  660. ⓪ BEGIN
  661. ⓪"ConvCard (n, 1, s);
  662. ⓪"Prompt (zeile, info, s, d); (* Wieso: Typ muß identisch mit VAR-Parameter sein??? *)
  663. ⓪"IF s [0] # CHR (0) THEN
  664. ⓪$(* ok := StrToCard (s, m); *)
  665. ⓪$pos := 0; (* ???? *)
  666. ⓪$m := StrToCard (s, pos, ok);
  667. ⓪$IF ok THEN n := m; END;
  668. ⓪"END (* IF *);
  669. ⓪ END ReadNum;
  670. ⓪ 
  671. ⓪ PROCEDURE LoeschePuffer (p: einPufferPointer);
  672. ⓪ BEGIN
  673. ⓪"IF (Editiert IN p^.Modus) THEN
  674. ⓪$SchirmSchreiben (p, p^.MerkPunkte [ErsteZeile].merkline, 0, 0);
  675. ⓪$IF FrageJaNein (Nein, 'Editierten Puffer löschen?') THEN
  676. ⓪&Loeschen (p);
  677. ⓪$END (* IF *);
  678. ⓪"ELSE Loeschen (p);
  679. ⓪"END (* IF *);
  680. ⓪ END LoeschePuffer;
  681. ⓪ 
  682. ⓪ PROCEDURE KopiereAusKlemmbrett (Puff: einPufferPointer;
  683. ⓪@ClipBoard: einPufferPointer);
  684. ⓪ VAR   Start:          einLinePointer;
  685. ⓪&z, zz:          eineZeile;
  686. ⓪&x, returnX, i:  CARDINAL;
  687. ⓪ BEGIN
  688. ⓪"MausBusy;
  689. ⓪"INCL (Puff^.Modus, Editiert);
  690. ⓪"Start := ClipBoard^.Puffer^.naechste;
  691. ⓪"IF (Start^.naechste # NIL) (* mehr als eine Zeile insertieren *)
  692. ⓪$(* Zeile nicht leer *) THEN
  693. ⓪$x := Puff^.MerkPunkte [LaufendeZeile].charpos;
  694. ⓪$DoCR (Puff, FALSE, returnX); (* laufende Zeile bei Cursor spalten *)
  695. ⓪$LineUp (Puff); Puff^.MerkPunkte [LaufendeZeile].charpos := x;
  696. ⓪"END (* IF *);
  697. ⓪"GetLine (Start, z); GetLine (Puff^.MerkPunkte [LaufendeZeile].merkline, zz);
  698. ⓪"IF LENGTH (z) + LENGTH (zz) <= cZeile THEN
  699. ⓪$WITH Puff^.MerkPunkte [LaufendeZeile] DO
  700. ⓪&IF charpos > LENGTH (zz) THEN
  701. ⓪(FOR i := LENGTH (zz) TO charpos - 1 DO
  702. ⓪*zz [i] := ' ';
  703. ⓪(END (* FOR *);
  704. ⓪(zz [charpos] := nul;
  705. ⓪&END (* IF *);
  706. ⓪$END (* WITH *);
  707. ⓪$Insert (z, Puff^.MerkPunkte [LaufendeZeile].charpos, zz);
  708. ⓪$PutLine (Puff^.MerkPunkte [LaufendeZeile].merkline, zz);
  709. ⓪"ELSE
  710. ⓪$LineUp (Puff);
  711. ⓪$InsertLine (Puff, Start^.ZeilPointer^, AutoIndent IN Puff^.Modus,
  712. ⓪0FALSE, TRUE);
  713. ⓪"END (* IF *);
  714. ⓪"Start := Start^.naechste;
  715. ⓪"IF Start = NIL THEN RETURN; END;
  716. ⓪!
  717. ⓪"WHILE Start^.naechste # NIL DO
  718. ⓪$InsertLine (Puff, Start^.ZeilPointer^, AutoIndent IN Puff^.Modus,
  719. ⓪0FALSE, TRUE);
  720. ⓪$Start := Start^.naechste;
  721. ⓪"END (* WHILE *);
  722. ⓪!
  723. ⓪"(* Die letzte Zeile wird wieder - an den Anfang der laufenden -
  724. ⓪%insertiert: *)
  725. ⓪"LineDown (Puff);
  726. ⓪"GetLine (Start, z); GetLine (Puff^.MerkPunkte [LaufendeZeile].merkline, zz);
  727. ⓪"IF LENGTH (z) + LENGTH (zz) <= cZeile THEN
  728. ⓪$Insert (z, 0, zz);
  729. ⓪$Puff^.MerkPunkte [LaufendeZeile].charpos := LENGTH (z);
  730. ⓪$PutLine (Puff^.MerkPunkte [LaufendeZeile].merkline, zz);
  731. ⓪"ELSE
  732. ⓪$LineUp (Puff);
  733. ⓪$InsertLine (Puff, Start^.ZeilPointer^, AutoIndent IN Puff^.Modus,
  734. ⓪0FALSE, TRUE);
  735. ⓪"END (* IF *);
  736. ⓪"ClipBoard^.MerkPunkte [LaufendeZeile].merkline := Start;
  737. ⓪"(* Wegen Blockmarken-Adjust! *)
  738. ⓪ END KopiereAusKlemmbrett;
  739. ⓪ 
  740. ⓪ PROCEDURE Kopiere (Puff: einPufferPointer; ClipBoard: einPufferPointer);
  741. ⓪ BEGIN
  742. ⓪"MausBusy;
  743. ⓪"WITH Puff^ DO
  744. ⓪$WITH MerkPunkte [BlockMarke1] DO
  745. ⓪&zeilpos := MerkPunkte [LaufendeZeile].zeilpos;
  746. ⓪&merkline := MerkPunkte [LaufendeZeile].merkline;
  747. ⓪&charpos := MerkPunkte [LaufendeZeile].charpos;
  748. ⓪$END (* WITH *);
  749. ⓪$KopiereAusKlemmbrett (Puff, ClipBoard);
  750. ⓪$WITH MerkPunkte [BlockMarke2] DO
  751. ⓪&zeilpos := MerkPunkte [LaufendeZeile].zeilpos;
  752. ⓪&merkline := MerkPunkte [LaufendeZeile].merkline;
  753. ⓪&(* charpos := MerkPunkte [LaufendeZeile].charpos; *)
  754. ⓪&IF ClipBoard^.Puffer^.naechste^.naechste # NIL THEN
  755. ⓪(charpos :=
  756. ⓪(LENGTH (ClipBoard^.MerkPunkte [LaufendeZeile].merkline^.ZeilPointer^);
  757. ⓪&ELSE
  758. ⓪(charpos := MerkPunkte [BlockMarke1].charpos
  759. ⓪*+ LENGTH (ClipBoard^.MerkPunkte [LaufendeZeile].merkline^.ZeilPointer^);
  760. ⓪&END (* IF *);
  761. ⓪&MerkPunkte [LaufendeZeile].charpos := charpos;
  762. ⓪$END (* WITH *);
  763. ⓪$StelleZeileEin (Puff, Puff^.MerkPunkte [BlockMarke2].zeilpos,
  764. ⓪4LinesOnScreen -3);
  765. ⓪$SchirmSchreiben (Puff, MerkPunkte [LaufendeZeile].merkline, 0, 0);
  766. ⓪"END (* WITH Puff *);
  767. ⓪ END Kopiere;
  768. ⓪ 
  769. ⓪ 
  770. ⓪ PROCEDURE LoescheBlockMarke1 (Puff: einPufferPointer);
  771. ⓪ BEGIN
  772. ⓪"WITH Puff^.MerkPunkte [BlockMarke1] DO
  773. ⓪$zeilpos := 0;
  774. ⓪$charpos := 0;
  775. ⓪$merkline := NIL;
  776. ⓪"END (* WITH *);
  777. ⓪ END LoescheBlockMarke1;
  778. ⓪ 
  779. ⓪ PROCEDURE LoescheBlockMarke2 (Puff: einPufferPointer);
  780. ⓪ BEGIN
  781. ⓪"WITH Puff^.MerkPunkte [BlockMarke2] DO
  782. ⓪$zeilpos := 0;
  783. ⓪$charpos := 0;
  784. ⓪$merkline := NIL;
  785. ⓪"END (* WITH *);
  786. ⓪ END LoescheBlockMarke2;
  787. ⓪ 
  788. ⓪ PROCEDURE LoescheBlockMarken (Puff: einPufferPointer);
  789. ⓪ BEGIN
  790. ⓪"LoescheBlockMarke1 (Puff);
  791. ⓪"LoescheBlockMarke2 (Puff);
  792. ⓪ END LoescheBlockMarken;
  793. ⓪ 
  794. ⓪ PROCEDURE Gueltig (Puff: einPufferPointer; marke: MerkIndex): BOOLEAN;
  795. ⓪"BEGIN
  796. ⓪$RETURN Puff^.MerkPunkte [marke].zeilpos > 0;
  797. ⓪"END Gueltig;
  798. ⓪ 
  799. ⓪ PROCEDURE Vor (Puff: einPufferPointer; one, two: MerkIndex): BOOLEAN;
  800. ⓪"VAR zeil1, zeil2: CARDINAL;
  801. ⓪"BEGIN
  802. ⓪#WITH Puff^ DO
  803. ⓪%zeil1:= MerkPunkte [one].zeilpos;
  804. ⓪%zeil2:= MerkPunkte [two].zeilpos;
  805. ⓪%RETURN (zeil1 < zeil2)
  806. ⓪'OR (zeil1 = zeil2) AND
  807. ⓪)(MerkPunkte [one].charpos < MerkPunkte [two].charpos)
  808. ⓪$END
  809. ⓪"END Vor;
  810. ⓪ 
  811. ⓪ PROCEDURE BlockMarkiert (Puff: einPufferPointer): BOOLEAN;
  812. ⓪"(* Liefert TRUE, wenn ein gültiger Block im Puffer markiert ist *)
  813. ⓪"(* Das ist der Fall, wenn Marke2 hinter Marke1 liegt *)
  814. ⓪"BEGIN
  815. ⓪$RETURN Gueltig (Puff, BlockMarke1) & Vor (Puff, BlockMarke1, BlockMarke2)
  816. ⓪"END BlockMarkiert;
  817. ⓪ 
  818. ⓪ PROCEDURE VorBlockMarke1 (Puff: einPufferPointer): BOOLEAN;
  819. ⓪"BEGIN
  820. ⓪$RETURN Vor (Puff, LaufendeZeile, BlockMarke1)
  821. ⓪"END VorBlockMarke1;
  822. ⓪ 
  823. ⓪ PROCEDURE HinterBlockMarke2 (Puff: einPufferPointer): BOOLEAN;
  824. ⓪"BEGIN
  825. ⓪$RETURN Gueltig (Puff, BlockMarke2) & Vor (Puff, BlockMarke2, LaufendeZeile)
  826. ⓪"END HinterBlockMarke2;
  827. ⓪ 
  828. ⓪ PROCEDURE InBlockMarken (Puff: einPufferPointer): BOOLEAN;
  829. ⓪"BEGIN
  830. ⓪$RETURN BlockMarkiert (Puff) &
  831. ⓪'NOT VorBlockMarke1 (Puff) &
  832. ⓪'NOT HinterBlockMarke2 (Puff)
  833. ⓪"END InBlockMarken;
  834. ⓪ 
  835. ⓪ PROCEDURE SetCharposToEndOfLine (Puff: einPufferPointer; index: MerkIndex);
  836. ⓪"BEGIN
  837. ⓪$WITH Puff^.MerkPunkte [index] DO
  838. ⓪&IF charpos > LENGTH (merkline^.ZeilPointer^) THEN
  839. ⓪(charpos := LENGTH (merkline^.ZeilPointer^)
  840. ⓪&END;
  841. ⓪$END;
  842. ⓪"END SetCharposToEndOfLine;
  843. ⓪ 
  844. ⓪ PROCEDURE MarkiereBlockAnfang (Puff: einPufferPointer);
  845. ⓪ VAR     merkZeile2, merkZeile1, dummyC: CARDINAL;
  846. ⓪(merkLine1:                      einLinePointer;
  847. ⓪ BEGIN
  848. ⓪"MausBusy;
  849. ⓪"SetCharposToEndOfLine (Puff, LaufendeZeile);
  850. ⓪"WITH Puff^ DO
  851. ⓪$(* altes Blockende merken *)
  852. ⓪$merkZeile2 := MerkPunkte [BlockMarke2].zeilpos;
  853. ⓪$WITH MerkPunkte [BlockMarke1] DO
  854. ⓪&IF (zeilpos = 0) OR (MerkPunkte [LaufendeZeile].zeilpos < zeilpos) THEN
  855. ⓪((* Laufende Zeile vor alter Marke *)
  856. ⓪(merkZeile1 := MerkPunkte [LaufendeZeile].zeilpos;
  857. ⓪&ELSE
  858. ⓪(merkZeile1 := zeilpos;
  859. ⓪&END;
  860. ⓪&zeilpos := MerkPunkte [LaufendeZeile].zeilpos;
  861. ⓪&merkline := MerkPunkte [LaufendeZeile].merkline;
  862. ⓪&charpos := MerkPunkte [LaufendeZeile].charpos;
  863. ⓪$END (* WITH *);
  864. ⓪$
  865. ⓪$SucheZeilenPointer (Puff, merkZeile1, merkLine1);
  866. ⓪$(*
  867. ⓪$StelleZeileEin (Puff, MerkPunkte [BlockMarke1].zeilpos,
  868. ⓪'MerkPunkte [BlockMarke1].zeilpos - MerkPunkte [ErsteZeile].zeilpos);
  869. ⓪$*)
  870. ⓪$IF NOT BlockMarkiert (Puff) THEN
  871. ⓪&(* ANDERE Marke löschen *)
  872. ⓪&LoescheBlockMarke2 (Puff);
  873. ⓪$END (* IF *);
  874. ⓪$IF merkZeile2 > 0 THEN
  875. ⓪&SchirmSchreiben (Puff, merkLine1, merkZeile2 - merkZeile1 + 1, 0);
  876. ⓪$END
  877. ⓪"END (* WITH *);
  878. ⓪ END MarkiereBlockAnfang;
  879. ⓪ 
  880. ⓪ PROCEDURE MarkiereBlockEnde (Puff: einPufferPointer);
  881. ⓪ VAR     merkZeile1, merkZeile2, dummyC:         CARDINAL;
  882. ⓪(merkLine1:                              einLinePointer;
  883. ⓪ BEGIN
  884. ⓪"MausBusy;
  885. ⓪"SetCharposToEndOfLine (Puff, LaufendeZeile);
  886. ⓪"WITH Puff^ DO
  887. ⓪$(* alten Blockanfang merken *)
  888. ⓪$merkZeile1 := MerkPunkte [BlockMarke1].zeilpos;
  889. ⓪$merkLine1 := MerkPunkte [BlockMarke1].merkline;
  890. ⓪$WITH MerkPunkte [BlockMarke2] DO
  891. ⓪&IF (MerkPunkte [LaufendeZeile].zeilpos > zeilpos) THEN
  892. ⓪((* neue Endmarke hinter bisherige Endmarke setzen *)
  893. ⓪(merkZeile2 := MerkPunkte [LaufendeZeile].zeilpos;
  894. ⓪&ELSE
  895. ⓪(merkZeile2 := zeilpos;
  896. ⓪&END (* IF - was ist groesser *);
  897. ⓪&zeilpos := MerkPunkte [LaufendeZeile].zeilpos;
  898. ⓪&merkline := MerkPunkte [LaufendeZeile].merkline;
  899. ⓪&charpos := MerkPunkte [LaufendeZeile].charpos;
  900. ⓪$END (* WITH *);
  901. ⓪$(*
  902. ⓪$StelleZeileEin (Puff, MerkPunkte [BlockMarke2].zeilpos,
  903. ⓪'MerkPunkte [BlockMarke2].zeilpos - MerkPunkte [ErsteZeile].zeilpos);
  904. ⓪$*)
  905. ⓪$IF NOT BlockMarkiert (Puff) THEN
  906. ⓪&(* ANDERE Marke löschen *)
  907. ⓪&LoescheBlockMarke1 (Puff);
  908. ⓪$END (* IF *);
  909. ⓪$IF merkZeile1 > 0 THEN
  910. ⓪&SchirmSchreiben (Puff, merkLine1, merkZeile2 - merkZeile1 + 1, 0);
  911. ⓪$END
  912. ⓪"END (* WITH *);
  913. ⓪ END MarkiereBlockEnde;
  914. ⓪ 
  915. ⓪ PROCEDURE KopiereLoesche (Puff, ClipBoard: einPufferPointer;
  916. ⓪:kopiere, loesche: BOOLEAN);
  917. ⓪ VAR   Start, FolgeZeile:    einLinePointer; (* auf die laufende Zeile *)
  918. ⓪&aktZeile, ii, ez, az, pos1, pos2: CARDINAL;
  919. ⓪&string, z: eineZeile;
  920. ⓪&firstLine: BOOLEAN;
  921. ⓪ 
  922. ⓪ BEGIN (* KopiereLoesche *)
  923. ⓪"IF kopiere & (ClipBoard^.Puffer = NIL) THEN
  924. ⓪$Nachricht ('Fehler: kein ClipBoard!'); RETURN;
  925. ⓪"END;
  926. ⓪"IF NOT BlockMarkiert (Puff) THEN
  927. ⓪$Nachricht ('Kein Block markiert!'); RETURN;
  928. ⓪"END;
  929. ⓪"MausBusy;
  930. ⓪"WITH Puff^ DO
  931. ⓪$az := MerkPunkte [BlockMarke1].zeilpos;
  932. ⓪$ez := MerkPunkte [BlockMarke2].zeilpos;
  933. ⓪$aktZeile := az;
  934. ⓪$Start := MerkPunkte [BlockMarke1].merkline;
  935. ⓪$
  936. ⓪$IF kopiere THEN Loeschen (ClipBoard) END;
  937. ⓪ 
  938. ⓪$firstLine:= TRUE;
  939. ⓪$pos1:= MerkPunkte [BlockMarke1].charpos;
  940. ⓪$LOOP
  941. ⓪&FolgeZeile := Start^.naechste;
  942. ⓪&IF firstLine OR (aktZeile = MerkPunkte [BlockMarke2].zeilpos) THEN
  943. ⓪((************ Zeile teilweise kopieren/löschen ************)
  944. ⓪(GetLine (Start, string);
  945. ⓪(IF aktZeile = MerkPunkte [BlockMarke2].zeilpos THEN
  946. ⓪*(* wir sind bei der letzten Zeile *)
  947. ⓪*pos2:= MerkPunkte [BlockMarke2].charpos
  948. ⓪(ELSE
  949. ⓪*pos2:= LENGTH (string)
  950. ⓪(END;
  951. ⓪(Copy (string, pos1, pos2 - pos1, z);
  952. ⓪(IF kopiere THEN
  953. ⓪*IF firstLine THEN
  954. ⓪,PutLine (ClipBoard^.MerkPunkte [LaufendeZeile].merkline, z)
  955. ⓪*ELSE
  956. ⓪,InsertLine (ClipBoard, z, FALSE, FALSE, TRUE)
  957. ⓪*END
  958. ⓪(END;
  959. ⓪(IF loesche THEN
  960. ⓪*INCL (Modus, Editiert);
  961. ⓪*Delete (string, pos1, pos2 - pos1);
  962. ⓪*PutLine (Start, string);
  963. ⓪*WITH MerkPunkte [LaufendeZeile] DO
  964. ⓪,zeilpos:= MerkPunkte [BlockMarke2].zeilpos;
  965. ⓪,charpos:= MerkPunkte [BlockMarke2].charpos;
  966. ⓪,merkline:= MerkPunkte [BlockMarke2].merkline
  967. ⓪*END;
  968. ⓪*IF NOT firstLine THEN
  969. ⓪,DoBackspace (Puff)
  970. ⓪*END
  971. ⓪(END;
  972. ⓪(IF aktZeile = MerkPunkte [BlockMarke2].zeilpos THEN
  973. ⓪*(* das war die letzte Zeile -> Fertig *)
  974. ⓪*EXIT
  975. ⓪(END;
  976. ⓪(INC (aktZeile);
  977. ⓪&ELSE
  978. ⓪((************ gesamte Zeile kopieren/löschen ************)
  979. ⓪(IF kopiere THEN
  980. ⓪*InsertLine (ClipBoard, Start^.ZeilPointer^, FALSE, FALSE, TRUE);
  981. ⓪(END;
  982. ⓪(IF loesche THEN
  983. ⓪*DeleteLine (Puff, Start, FALSE, FALSE);
  984. ⓪(ELSE
  985. ⓪*INC (aktZeile);
  986. ⓪(END;
  987. ⓪&END;
  988. ⓪&Start := FolgeZeile;
  989. ⓪&IF Start = NIL THEN
  990. ⓪((* Textende *)
  991. ⓪(EXIT
  992. ⓪&END;
  993. ⓪&firstLine:= FALSE;
  994. ⓪&pos1:= 0;
  995. ⓪$END;
  996. ⓪$IF loesche THEN
  997. ⓪&(* Cursor auf gelöschte Stelle setzen *)
  998. ⓪&WITH MerkPunkte [LaufendeZeile] DO
  999. ⓪(SucheZeilenPointer (Puff, az, merkline);
  1000. ⓪(zeilpos := az;
  1001. ⓪(charpos:= MerkPunkte [BlockMarke1].charpos;
  1002. ⓪&END;
  1003. ⓪&(* Screen neu zeichnen *)
  1004. ⓪&LoescheBlockMarken (Puff);
  1005. ⓪&SchirmSchreiben (Puff, MerkPunkte [LaufendeZeile].merkline, 0, 0);
  1006. ⓪$END;
  1007. ⓪"END
  1008. ⓪ END KopiereLoesche;
  1009. ⓪ 
  1010. ⓪ PROCEDURE RueckeBlockEin (Puff: einPufferPointer);
  1011. ⓪ VAR     bef:                    einTasteneintrag;
  1012. ⓪(index, i, t:            CARDINAL;
  1013. ⓪(x, y:                   CARDINAL;
  1014. ⓪(bewegt, Doit, Schirm:   BOOLEAN;
  1015. ⓪(Knoepfe:                ButtonSet;
  1016. ⓪(blank:                  ARRAY [0..80] OF CHAR;
  1017. ⓪ 
  1018. ⓪"PROCEDURE Ruecke (links: BOOLEAN);
  1019. ⓪"VAR   Zeile:          einLinePointer;
  1020. ⓪(Zeilstr:        ARRAY [0..cZeile] OF CHAR;
  1021. ⓪(l:              CARDINAL;
  1022. ⓪"BEGIN
  1023. ⓪$WITH Puff^ DO
  1024. ⓪&INCL (Modus, Editiert);
  1025. ⓪&IF index >= Max THEN RETURN END;
  1026. ⓪&Zeile := MerkPunkte [BlockMarke1].merkline;
  1027. ⓪&IF Zeile = NIL THEN RETURN; END;
  1028. ⓪&REPEAT
  1029. ⓪(GetLine (Zeile, Zeilstr); l := LENGTH (Zeile^.ZeilPointer^);
  1030. ⓪(IF (index  > l) & ~links THEN
  1031. ⓪*WHILE (index > l) DO
  1032. ⓪,Zeilstr [l] := ' '; INC (l);
  1033. ⓪*END (* WHILE *);
  1034. ⓪*Zeilstr [l] := nul;
  1035. ⓪(END (* IF index *);
  1036. ⓪(IF (l >= index) THEN
  1037. ⓪*IF links THEN
  1038. ⓪,Delete (Zeilstr, index, 1);
  1039. ⓪*ELSE
  1040. ⓪,Insert (blank, index, Zeilstr);
  1041. ⓪*END (* IF links oder rechts ruecken *);
  1042. ⓪*PutLine (Zeile, Zeilstr);
  1043. ⓪(END (* IF Laenge *);
  1044. ⓪(IF Zeile # MerkPunkte [BlockMarke2].merkline THEN
  1045. ⓪*Zeile := Zeile^.naechste;
  1046. ⓪(END (* IF *);
  1047. ⓪&UNTIL (Zeile = MerkPunkte [BlockMarke2].merkline) OR (Zeile = NIL);
  1048. ⓪$END (* WITH Puff *);
  1049. ⓪"END Ruecke;
  1050. ⓪"
  1051. ⓪ BEGIN (* RueckeBlockEin *)
  1052. ⓪"GotoXY (0, 0); HighLight;
  1053. ⓪"WriteConst (
  1054. ⓪"'Block einrücken (bei Cursor <-, ->), BS, Zeichen, RETURN fuer Ende');
  1055. ⓪"LoescheZeile;
  1056. ⓪"Normal;
  1057. ⓪"blank [0] := ' '; blank [1] := nul;
  1058. ⓪"index := Puff^.MerkPunkte [LaufendeZeile].charpos;
  1059. ⓪"WITH Puff^ DO
  1060. ⓪$GotoXY (MerkPunkte [LaufendeZeile].charpos -
  1061. ⓪*MerkPunkte [ErsteZeile].charpos,
  1062. ⓪*MerkPunkte [LaufendeZeile].zeilpos -
  1063. ⓪,MerkPunkte [ErsteZeile].zeilpos);
  1064. ⓪"END (* WITH *);
  1065. ⓪"REPEAT
  1066. ⓪$bef.TT := keineTaste; Doit := FALSE; Schirm := FALSE;
  1067. ⓪$IF TasteBereit() THEN LiesTaste (bef);
  1068. ⓪$ELSE MausPos (x, y, bewegt, Knoepfe);
  1069. ⓪)IF Left IN Knoepfe THEN
  1070. ⓪+bef.TT := Befehl; bef.bef := RollLeft;
  1071. ⓪)ELSIF Right IN Knoepfe THEN
  1072. ⓪+bef.TT := Befehl; bef.bef := RollRight;
  1073. ⓪)END;
  1074. ⓪$END (* IF *);
  1075. ⓪$IF bef.TT = Befehl THEN
  1076. ⓪&CASE bef.bef OF
  1077. ⓪(tabulator:        LoescheQueue;
  1078. ⓪:WITH Puff^ DO
  1079. ⓪<t := TabWeite * ((x DIV TabWeite) + 1);
  1080. ⓪<FOR i := x TO t DO
  1081. ⓪>blank [i - x] := ' ';
  1082. ⓪<END;
  1083. ⓪<blank [t - x + 1] := nul;
  1084. ⓪<Ruecke (FALSE);
  1085. ⓪<INC (MerkPunkte [LaufendeZeile].charpos, t -x + 1);
  1086. ⓪<Doit := TRUE; Schirm := TRUE;
  1087. ⓪<index :=   MerkPunkte [LaufendeZeile].charpos;
  1088. ⓪:END (* WITH *);|
  1089. ⓪(cursleft:         LoescheQueue;
  1090. ⓪:WITH Puff^ DO
  1091. ⓪<IF MerkPunkte [LaufendeZeile].charpos > 0 THEN
  1092. ⓪>DEC (MerkPunkte [LaufendeZeile].charpos);
  1093. ⓪>Doit := TRUE;
  1094. ⓪>index := MerkPunkte [LaufendeZeile].charpos;
  1095. ⓪<END (* IF *);
  1096. ⓪:END (* WITH *);|
  1097. ⓪(DelLChar:         LoescheQueue;
  1098. ⓪:WITH Puff^ DO
  1099. ⓪<IF MerkPunkte [LaufendeZeile].charpos > 0 THEN
  1100. ⓪>DEC (MerkPunkte [LaufendeZeile].charpos);
  1101. ⓪>Doit := TRUE; Schirm := TRUE;
  1102. ⓪>index := MerkPunkte [LaufendeZeile].charpos;
  1103. ⓪>Ruecke (TRUE);
  1104. ⓪<END (* IF *);
  1105. ⓪:END (* WITH *);|
  1106. ⓪(cursright:        LoescheQueue;
  1107. ⓪:WITH Puff^ DO
  1108. ⓪<IF MerkPunkte [LaufendeZeile].charpos < Max THEN
  1109. ⓪>INC (MerkPunkte [LaufendeZeile].charpos);
  1110. ⓪>Doit := TRUE;
  1111. ⓪>index := MerkPunkte [LaufendeZeile].charpos;
  1112. ⓪<END (* IF *);
  1113. ⓪:END (* WITH *);|
  1114. ⓪(DelRChar, RollLeft (* RollLeft *):
  1115. ⓪:LoescheQueue;
  1116. ⓪:Ruecke (TRUE); Doit := TRUE; Schirm := TRUE;|
  1117. ⓪(RollRight (* RollRight *):
  1118. ⓪:LoescheQueue;
  1119. ⓪:Ruecke (FALSE); Doit := TRUE; Schirm := TRUE;
  1120. ⓪(ELSE;
  1121. ⓪(END (* CASE *);
  1122. ⓪&
  1123. ⓪&ELSE      IF bef.TT = Zeichen THEN
  1124. ⓪2(* nicht LoescheQueue!!! *)
  1125. ⓪2IF bef.zch = ' ' THEN LoescheQueue; END;
  1126. ⓪2blank [0] := bef.zch; blank [1] := nul;
  1127. ⓪2Ruecke (FALSE);
  1128. ⓪2Doit := TRUE; Schirm := TRUE;
  1129. ⓪2WITH Puff^ DO
  1130. ⓪4IF MerkPunkte [LaufendeZeile].charpos < Max THEN
  1131. ⓪6INC (MerkPunkte [LaufendeZeile].charpos);
  1132. ⓪6index := Puff^.MerkPunkte [LaufendeZeile].charpos;
  1133. ⓪4END (* IF *);
  1134. ⓪2END (* WITH *);
  1135. ⓪0END (* IF *);
  1136. ⓪$END (* IF *);
  1137. ⓪$IF Doit THEN
  1138. ⓪&(* 12. 1. 88 *)
  1139. ⓪&WITH Puff^ DO
  1140. ⓪(IF Schirm THEN
  1141. ⓪*SchirmSchreiben (Puff, MerkPunkte [BlockMarke1].merkline,
  1142. ⓪;MerkPunkte [BlockMarke2].zeilpos -
  1143. ⓪;MerkPunkte [BlockMarke1].zeilpos + 1, 0);
  1144. ⓪*INCL (Modus, Editiert);
  1145. ⓪(END (* IF Schirm *);
  1146. ⓪(GotoXY (MerkPunkte [LaufendeZeile].charpos -
  1147. ⓪.MerkPunkte [ErsteZeile].charpos,
  1148. ⓪,MerkPunkte [LaufendeZeile].zeilpos -
  1149. ⓪.MerkPunkte [ErsteZeile].zeilpos);
  1150. ⓪&END (* WITH *);
  1151. ⓪$END (* IF Doit *);
  1152. ⓪"UNTIL ((bef.TT = Befehl) & ((bef.bef = return) OR (bef.bef = Quit) OR
  1153. ⓪*(bef.bef = QuitCompile)));
  1154. ⓪"LoescheBlockMarken (Puff);
  1155. ⓪"SchirmSchreiben (Puff, Puff^.MerkPunkte [LaufendeZeile].merkline, 0, 0);
  1156. ⓪ END RueckeBlockEin;
  1157. ⓪ 
  1158. ⓪ PROCEDURE SucheWort (Puff: einPufferPointer;
  1159. ⓪5w: ARRAY OF CHAR; VAR gefunden: BOOLEAN;
  1160. ⓪5key: einTasteneintrag (* cursup, cursdown, return *));
  1161. ⓪ 
  1162. ⓪ (* Schnelle Stringsuche nach Boyer-Moore, vgl. N. Wirth: Algorithmen
  1163. ⓪#und Datenstrukturen mit Modula-2, Teubner 1986, S. 67ff *)
  1164. ⓪ VAR   LaufZeil: einLinePointer;         (* Zeile in der gerade
  1165. ⓪Kgesucht wird *)
  1166. ⓪&ZeilNum:  CARDINAL;               (* Nummer der aktu. Zeile *)
  1167. ⓪&startx:   CARDINAL;               (* Position, ab der in der
  1168. ⓪KZeile gesucht werden soll *)
  1169. ⓪&findx:    CARDINAL;               (* gefundene Position *)
  1170. ⓪&dummy:    CHAR;
  1171. ⓪&gross:    BOOLEAN;
  1172. ⓪&up:       BOOLEAN;
  1173. ⓪&
  1174. ⓪&Tabelle:  ARRAY [0C..377C] OF INTEGER; (* Tabelle der Zeichen-
  1175. ⓪@positionen im String (von hinten) *)
  1176. ⓪&M, j:     INTEGER;        (* M: Laenge des Suchstrings *)
  1177. ⓪&L:        CARDINAL;       (* Laenge der untersuchten Zeile *)
  1178. ⓪ 
  1179. ⓪$PROCEDURE LCAP (ch: CHAR): CHAR;
  1180. ⓪$BEGIN
  1181. ⓪&IF gross THEN
  1182. ⓪(RETURN CAP (ch)
  1183. ⓪&ELSE
  1184. ⓪(RETURN ch;
  1185. ⓪&END;
  1186. ⓪$END LCAP;
  1187. ⓪ 
  1188. ⓪$PROCEDURE LCAPS (VAR s: ARRAY OF CHAR; L: INTEGER);
  1189. ⓪$VAR i:      INTEGER;
  1190. ⓪$BEGIN
  1191. ⓪&IF L > 0 THEN
  1192. ⓪(FOR i := 0 TO L - 1 DO
  1193. ⓪*s [i] := (*L*)CAP (s [i]);
  1194. ⓪(END (* FOR *);
  1195. ⓪&END (* IF *);
  1196. ⓪$END LCAPS;
  1197. ⓪ 
  1198. ⓪"PROCEDURE Pos (start: CARDINAL; VAR substr, str: ARRAY OF CHAR;
  1199. ⓪1N: INTEGER): CARDINAL;
  1200. ⓪"VAR   index, k, j:    INTEGER;
  1201. ⓪(ch:             CHAR;
  1202. ⓪ 
  1203. ⓪"BEGIN
  1204. ⓪$(* N := LENGTH (str); *)
  1205. ⓪$IF M > N THEN RETURN N + 1 END;
  1206. ⓪$index := M + INTEGER (start);
  1207. ⓪((* Index, bei dem die Suche startet (Wortende) *)
  1208. ⓪$REPEAT
  1209. ⓪&j := M; k := index; (* Laufindizes setzen *)
  1210. ⓪&REPEAT
  1211. ⓪(DEC (k); DEC (j);
  1212. ⓪&UNTIL (j < 0) OR (substr [j] # LCAP (str [k]));
  1213. ⓪((* vergleicht substr [j] mit str [k] bis Ungleichheit oder
  1214. ⓪+Suchstring erschoepft *)
  1215. ⓪&IF (j >= 0) THEN INC (index, Tabelle [ LCAP (str [index - 1])]);
  1216. ⓪&END (* IF nicht gefunden *);
  1217. ⓪$UNTIL (j < 0) OR (index > N);
  1218. ⓪$IF (j < 0) & (index <= N) THEN
  1219. ⓪&RETURN CARDINAL (index - M);
  1220. ⓪$ELSE
  1221. ⓪&RETURN CARDINAL (N + 1);
  1222. ⓪$END (* IF *);
  1223. ⓪"END Pos;
  1224. ⓪"
  1225. ⓪"PROCEDURE WortTest (VAR s: ARRAY OF CHAR): BOOLEAN;
  1226. ⓪"VAR   links, rechts:  BOOLEAN;
  1227. ⓪"(* findx ist die Startposition des Suchstrings, findx + M - 1 die Endp. *)
  1228. ⓪"(* L ist die Laenge der untersuchten Zeile *)
  1229. ⓪"BEGIN
  1230. ⓪$IF ~(WortSuche IN Puff^.Modus) THEN
  1231. ⓪&RETURN TRUE;
  1232. ⓪$ELSE
  1233. ⓪&links := (findx = 0) OR (s [findx] IN TrennSet) OR
  1234. ⓪/(s [findx - 1] IN TrennSet);
  1235. ⓪&IF ~links THEN RETURN FALSE
  1236. ⓪&ELSE
  1237. ⓪(rechts := (findx + CARDINAL (M) > L) OR
  1238. ⓪2(s [findx + CARDINAL (M) - 1] IN TrennSet) OR
  1239. ⓪2(s [findx + CARDINAL (M)] IN TrennSet);
  1240. ⓪(RETURN rechts;
  1241. ⓪&END (* inneres IF *);
  1242. ⓪$END (* IF *);
  1243. ⓪"END WortTest;
  1244. ⓪ 
  1245. ⓪ VAR     d:      CHAR;
  1246. ⓪ 
  1247. ⓪ BEGIN (* SucheWort *)
  1248. ⓪"up := key.bef = cursup;
  1249. ⓪"
  1250. ⓪"M := LENGTH (w); (* Anzahl der Zeichen im Suchstring *)
  1251. ⓪ 
  1252. ⓪"IF ~(GrossKleinSuche IN Puff^.Modus) THEN
  1253. ⓪$gross := TRUE; LCAPS (w, M);
  1254. ⓪"ELSE
  1255. ⓪$gross := FALSE;
  1256. ⓪"END (* IF nicht Gross und Klein unterscheiden *);
  1257. ⓪"(* Initialisieren der Suchtabelle: Fuer jedes Zeichen, das im
  1258. ⓪%Suchstring vorkommt, wird festgehalten, wie weit sein letztes
  1259. ⓪%Vorkommen vom Ende des Strings entfernt ist. *)
  1260. ⓪"
  1261. ⓪"FOR dummy := 0C TO 377C DO
  1262. ⓪$Tabelle [dummy] := M; (* Tabelle vor-initalisieren *)
  1263. ⓪"END (* FOR *);
  1264. ⓪ 
  1265. ⓪"(* Fuer jede Position im Suchwort w wird unter dem Index des
  1266. ⓪%jten Zeichens in die Tabelle der Abstand vom Ende des Such-
  1267. ⓪%wortes eingetragen. *)
  1268. ⓪"FOR j := 0 TO M-2 DO
  1269. ⓪$Tabelle [w [j]] := M - j - 1;
  1270. ⓪"END (* FOR *);
  1271. ⓪"
  1272. ⓪"WITH Puff^ DO
  1273. ⓪$LaufZeil := MerkPunkte [LaufendeZeile].merkline;
  1274. ⓪$ZeilNum := MerkPunkte [LaufendeZeile].zeilpos;
  1275. ⓪$startx := MerkPunkte [LaufendeZeile].charpos;
  1276. ⓪$
  1277. ⓪$L := LENGTH (LaufZeil^.ZeilPointer^);
  1278. ⓪$findx := Pos (startx, w, LaufZeil^.ZeilPointer^, L);
  1279. ⓪$LOOP
  1280. ⓪&IF ~ ((findx > L) OR ~WortTest (LaufZeil^.ZeilPointer^)) THEN
  1281. ⓪(EXIT;
  1282. ⓪&END (* IF *);
  1283. ⓪&IF up THEN
  1284. ⓪(IF (LaufZeil^.vorige # Puffer) & (findx > L) THEN
  1285. ⓪*LaufZeil := LaufZeil^.vorige; startx := 0;
  1286. ⓪*L := LENGTH (LaufZeil^.ZeilPointer^); DEC (ZeilNum);
  1287. ⓪(ELSIF (LaufZeil^.vorige = Puffer) & (findx > L) THEN
  1288. ⓪*EXIT;
  1289. ⓪(END (* IF *);
  1290. ⓪&ELSE (* IF ~up *)
  1291. ⓪(IF (LaufZeil^.naechste # NIL) & (findx > L) THEN
  1292. ⓪*LaufZeil := LaufZeil^.naechste; startx := 0;
  1293. ⓪*L := LENGTH (LaufZeil^.ZeilPointer^); INC (ZeilNum);
  1294. ⓪(ELSIF (LaufZeil^.naechste = NIL) & (findx > L) THEN
  1295. ⓪*EXIT;
  1296. ⓪(ELSE
  1297. ⓪*startx := startx + CARDINAL (M);
  1298. ⓪(END (* IF *);
  1299. ⓪&END (* IF up *);
  1300. ⓪&findx := Pos (startx, w, LaufZeil^.ZeilPointer^, L);
  1301. ⓪$END (* LOOP *);
  1302. ⓪"
  1303. ⓪$IF (findx < L) (* & WortTest (LaufZeil^.ZeilPointer^) *) THEN
  1304. ⓪&MerkPunkte [LaufendeZeile].charpos := findx + CARDINAL (M);
  1305. ⓪&MerkPunkte [LaufendeZeile].merkline := LaufZeil;
  1306. ⓪&MerkPunkte [LaufendeZeile].zeilpos := ZeilNum;
  1307. ⓪&MerkPunkte [ErsteZeile].merkline := MerkPunkte [LaufendeZeile].merkline;
  1308. ⓪&MerkPunkte [ErsteZeile].zeilpos := MerkPunkte [LaufendeZeile].zeilpos - 1;
  1309. ⓪&WHILE (MerkPunkte [ErsteZeile].merkline^.vorige # Puffer) &
  1310. ⓪,((MerkPunkte [ErsteZeile].zeilpos + LinesOnScreen DIV 2) >
  1311. ⓪,MerkPunkte [LaufendeZeile].zeilpos) DO
  1312. ⓪(MerkPunkte [ErsteZeile].merkline :=
  1313. ⓪*MerkPunkte [ErsteZeile].merkline^.vorige;
  1314. ⓪(DEC (MerkPunkte [ErsteZeile].zeilpos);
  1315. ⓪&END (* WHILE *);
  1316. ⓪&gefunden := TRUE;
  1317. ⓪$ELSE
  1318. ⓪&gefunden := FALSE;
  1319. ⓪$END (* IF gefunden *);
  1320. ⓪"END (* WITH *);
  1321. ⓪ END SucheWort;
  1322. ⓪ 
  1323. ⓪ PROCEDURE TauscheWort (Puff: einPufferPointer;
  1324. ⓪7VAR s, t: ARRAY OF CHAR; maxx: CARDINAL;
  1325. ⓪7modus: einTasteneintrag);
  1326. ⓪ VAR     Zeile:  eineZeile;
  1327. ⓪(sl:     CARDINAL;
  1328. ⓪ BEGIN
  1329. ⓪"sl := LENGTH (s);
  1330. ⓪"WITH Puff^ DO
  1331. ⓪$DEC (MerkPunkte [LaufendeZeile].charpos, sl);
  1332. ⓪$GetLine (MerkPunkte [LaufendeZeile].merkline, Zeile);
  1333. ⓪$Delete (Zeile, MerkPunkte [LaufendeZeile].charpos, sl);
  1334. ⓪$IF CAP (modus.zch) = 'F' THEN
  1335. ⓪$END (* IF modus *);
  1336. ⓪$IF (LENGTH (Zeile) + LENGTH (t) <= cZeile) THEN
  1337. ⓪&Insert (t, MerkPunkte [LaufendeZeile].charpos, Zeile);
  1338. ⓪&INCL (Modus, Editiert);
  1339. ⓪&sl := LENGTH (t);
  1340. ⓪$ELSE Insert (s, MerkPunkte [LaufendeZeile].charpos, Zeile);
  1341. ⓪$END (* IF *);
  1342. ⓪$PutLine (MerkPunkte [LaufendeZeile].merkline, Zeile);
  1343. ⓪$INC (MerkPunkte [LaufendeZeile].charpos, sl);
  1344. ⓪"END (* WITH Puff *);
  1345. ⓪ END TauscheWort;
  1346. ⓪ 
  1347. ⓪ (* END EditUtil. *)
  1348. ⓪ 
  1349. ⓪ (**************************** EditScreen ****************************)
  1350. ⓪ 
  1351. ⓪ CONST   cTabWeite =     8;
  1352. ⓪ 
  1353. ⓪ VAR     Handle:         INTEGER;
  1354. ⓪(CursorAn:       BOOLEAN;
  1355. ⓪(CursorBlink:    BOOLEAN;
  1356. ⓪(alteBlinkrate:  INTEGER;
  1357. ⓪(altesAttribut:  INTEGER;
  1358. ⓪ 
  1359. ⓪ PROCEDURE InsertZeile (Puff: einPufferPointer; n: CARDINAL);
  1360. ⓪ BEGIN
  1361. ⓪"WITH Puff^ DO
  1362. ⓪$GotoXY (0, n - MerkPunkte [ErsteZeile].zeilpos);
  1363. ⓪$InsertLn;
  1364. ⓪"END (* WITH *);
  1365. ⓪ END InsertZeile;
  1366. ⓪ 
  1367. ⓪ PROCEDURE DeleteZeile (Puff: einPufferPointer; n: CARDINAL);
  1368. ⓪ BEGIN
  1369. ⓪"WITH Puff^ DO
  1370. ⓪$GotoXY (0, n - MerkPunkte [ErsteZeile].zeilpos);
  1371. ⓪$DeleteLn;
  1372. ⓪"END (* WITH *);
  1373. ⓪ END DeleteZeile;
  1374. ⓪ 
  1375. ⓪ PROCEDURE High   (v, h: CHAR; n: ARRAY OF CHAR);
  1376. ⓪ BEGIN
  1377. ⓪"WriteChar (v); HighLight; WriteChar (h); Normal;
  1378. ⓪"WriteLine (n);
  1379. ⓪ END High;
  1380. ⓪ 
  1381. ⓪ PROCEDURE HighL  (v, h: CHAR; n: ARRAY OF CHAR);
  1382. ⓪ BEGIN
  1383. ⓪"High (v, h, n); WriteLn;
  1384. ⓪ END HighL;
  1385. ⓪ 
  1386. ⓪ VAR endline:    CARDINAL; (* Very dirty - see HighLine & Schirmschreiben *)
  1387. ⓪ 
  1388. ⓪ PROCEDURE WriteString (xoff: CARDINAL; (*Control, Tabs: BOOLEAN;*)
  1389. ⓪7VAR s: ARRAY OF CHAR);
  1390. ⓪ (* Schnelle Stringausgabe, nicht durch ^C abbrechbar. *)
  1391. ⓪ CONST   cPufferlaenge =                 400;
  1392. ⓪ VAR     (*$Reg*)sindex, (*$Reg*)bildsind, (*$Reg*)l, (*$Reg*)sichtbarez,
  1393. ⓪(tabsexp:             CARDINAL;
  1394. ⓪(bilds:                          ARRAY [0..cPufferlaenge] OF CHAR;
  1395. ⓪(high, low:     CHAR;
  1396. ⓪(x, y: CARDINAL;
  1397. ⓪((*tj: CARDINAL;*)
  1398. ⓪ BEGIN
  1399. ⓪"WhereXY (x, y);
  1400. ⓪"high := 'p'; low := 'q';
  1401. ⓪"(*IF ~Tabs THEN tj := tabjump ELSE tj := 1; END;*)
  1402. ⓪"sindex := xoff;
  1403. ⓪"bildsind := 0; l := LENGTH (s); sichtbarez := 0;
  1404. ⓪"WHILE (sindex < l) & (sichtbarez + CARDINAL (x)  <= CharsInLine) &
  1405. ⓪((bildsind + 5 <= cPufferlaenge) DO
  1406. ⓪$IF (s [sindex] = escape)
  1407. ⓪$AND ((s [sindex + 1] = 'q') OR (s [sindex + 1] = 'p')) THEN
  1408. ⓪&IF (s [sindex + 1] = 'p') THEN
  1409. ⓪(high := 'q'; low := 'p';
  1410. ⓪&ELSIF (s [sindex + 1] = 'q') THEN
  1411. ⓪(high := 'p'; low := 'q';
  1412. ⓪&END (* IF *);
  1413. ⓪&bilds [bildsind] := s [sindex]; bilds [bildsind + 1] := s [sindex + 1];
  1414. ⓪&INC (bildsind); INC (sindex);
  1415. ⓪$(*
  1416. ⓪$ELSIF (s [sindex] = tab) & ~Tabs THEN
  1417. ⓪&tabsexp := sichtbarez + CARDINAL (x) - 1;
  1418. ⓪&INC (tabsexp, tabjump * ((tabsexp DIV tabjump) + 1) - tabsexp);
  1419. ⓪&DEC (tabsexp, CARDINAL (x) - 1);
  1420. ⓪&WHILE (sichtbarez < tabsexp) DO
  1421. ⓪(bilds [bildsind] := ' '; INC (bildsind); INC (sichtbarez);
  1422. ⓪&END (* WHILE *);
  1423. ⓪&DEC (bildsind);
  1424. ⓪$*)
  1425. ⓪$ELSIF (s [sindex] < ' ') THEN
  1426. ⓪&(*IF Control THEN*)
  1427. ⓪(bilds [bildsind] := escape; bilds [bildsind + 1] := high;
  1428. ⓪(bilds [bildsind + 2] := CHR (ORD (s [sindex]) + ORD ('@'));
  1429. ⓪(bilds [bildsind + 3] := escape; bilds [bildsind + 4] := low;
  1430. ⓪(INC (bildsind, 4);
  1431. ⓪&(*END (* IF *);*)
  1432. ⓪$ELSE
  1433. ⓪&bilds [bildsind] := s [sindex]; INC (sichtbarez);
  1434. ⓪$END (* IF *);
  1435. ⓪$INC (sindex); INC (bildsind);
  1436. ⓪"END (* WHILE *);
  1437. ⓪"bilds [bildsind] := nul; endline := sichtbarez;
  1438. ⓪"WriteLine (bilds);
  1439. ⓪ END WriteString;
  1440. ⓪ 
  1441. ⓪ PROCEDURE HighLine (start, ende, xoff: CARDINAL; (*Control, Tabs: BOOLEAN;*)
  1442. ⓪4VAR s: ARRAY OF CHAR);
  1443. ⓪ VAR     p: ARRAY [0..511] OF CHAR;
  1444. ⓪((*$Reg*)i, (*$Reg*)j, (*$Reg*)l, (*$Reg*)k: CARDINAL;
  1445. ⓪ BEGIN
  1446. ⓪"(*IF ~Tabs THEN tj := tabjump ELSE tj := 1 END;*)
  1447. ⓪"i := xoff;
  1448. ⓪"j := 0; l := LENGTH (s); k := 0;
  1449. ⓪"IF (i > start) & (i < ende) THEN
  1450. ⓪$p [j] := escape; p [j + 1] := 'p'; INC (j, 2);
  1451. ⓪"END;
  1452. ⓪"WHILE (i < l) & (k <= CharsInLine) DO
  1453. ⓪$IF i = start THEN
  1454. ⓪&p [j] := escape; p [j + 1] := 'p';
  1455. ⓪&INC (j, 2);
  1456. ⓪$END (* IF start HighLight *);
  1457. ⓪$IF i = ende THEN
  1458. ⓪&p [j] := escape; p [j + 1] := 'q';
  1459. ⓪&INC (j, 2);
  1460. ⓪$END (* IF ende HighLight *);
  1461. ⓪$p [j] := s [i]; INC (j); INC (i); INC (k);
  1462. ⓪"END (* WHILE *);
  1463. ⓪"IF i <= ende THEN
  1464. ⓪$p [j] := escape; p [j + 1] := 'q';
  1465. ⓪$INC (j, 2);
  1466. ⓪"END (* IF ende HighLight *);
  1467. ⓪"p [j] := nul;
  1468. ⓪"WriteString (0, (*Control, Tabs,*) p);
  1469. ⓪ END HighLine;
  1470. ⓪ 
  1471. ⓪ PROCEDURE MakeHighLine (Puff: einPufferPointer; (*Control, Tabs: BOOLEAN;*)
  1472. ⓪8argzeile: CARDINAL;
  1473. ⓪8VAR inhalt: ARRAY OF CHAR);
  1474. ⓪ VAR (*$Reg*)zeile, (*$Reg*)zeil1, (*$Reg*)zeil2: CARDINAL;
  1475. ⓪ BEGIN
  1476. ⓪"WITH Puff^ DO
  1477. ⓪$zeil1:= MerkPunkte [BlockMarke1].zeilpos;
  1478. ⓪$IF zeil1 = 0 THEN
  1479. ⓪&(* kein Block markiert *)
  1480. ⓪&WriteString (MerkPunkte [ErsteZeile].charpos, (*Control, Tabs,*) inhalt);
  1481. ⓪$ELSE
  1482. ⓪&zeile:= argzeile; (* um sie als Reg-Var benutzen zu können *)
  1483. ⓪&zeil2:= MerkPunkte [BlockMarke2].zeilpos;
  1484. ⓪&IF zeil2 = 0 THEN
  1485. ⓪((* kein Block markiert *)
  1486. ⓪(WriteString (MerkPunkte [ErsteZeile].charpos, (*Control, Tabs,*) inhalt);
  1487. ⓪&ELSIF (zeil1 < zeile) & (zeil2 > zeile) THEN
  1488. ⓪(HighLine (0, LENGTH (inhalt), MerkPunkte [ErsteZeile].charpos,
  1489. ⓪2(*Control, Tabs,*) inhalt);
  1490. ⓪&ELSIF (zeil1 = zeile) & (zeil2 > zeile) THEN
  1491. ⓪(HighLine (MerkPunkte [BlockMarke1].charpos, LENGTH (inhalt),
  1492. ⓪2MerkPunkte [ErsteZeile].charpos, (*Control, Tabs,*) inhalt)
  1493. ⓪&ELSIF (zeil1 = zeile) & (zeil2 = zeile) THEN
  1494. ⓪(HighLine (MerkPunkte [BlockMarke1].charpos,
  1495. ⓪2MerkPunkte [BlockMarke2].charpos,
  1496. ⓪2MerkPunkte [ErsteZeile].charpos, (*Control, Tabs,*) inhalt);
  1497. ⓪&ELSIF (zeil1 < zeile) & (zeil2 = zeile) THEN
  1498. ⓪(HighLine (0, MerkPunkte [BlockMarke2].charpos,
  1499. ⓪2MerkPunkte [ErsteZeile].charpos, (*Control, Tabs,*) inhalt);
  1500. ⓪&ELSE
  1501. ⓪(WriteString (MerkPunkte [ErsteZeile].charpos, (*Control, Tabs,*) inhalt);
  1502. ⓪&END (* IF *);
  1503. ⓪$END (* IF *);
  1504. ⓪"END (* WITH *);
  1505. ⓪ END MakeHighLine;
  1506. ⓪ 
  1507. ⓪ PROCEDURE SchirmSchreiben2 (Puff: einPufferPointer;
  1508. ⓪<Start: einLinePointer;
  1509. ⓪<Anzahl: CARDINAL;
  1510. ⓪<SOffset: INTEGER);
  1511. ⓪ 
  1512. ⓪ (* Start sollte die erste geaenderte Zeile sein. Schirm-
  1513. ⓪#Schreiben bestimmt daraus und aus der ZeilenNummer von Puff.Erste-
  1514. ⓪#Zeile die Schnittmenge der auf dem Bildschirm darzustellenden
  1515. ⓪#Zeilen sowie den korrekten Y-Offset. Die rufenden Prozeduren sollten
  1516. ⓪#sich nicht darum kuemmern muessen, ob der geforderte Updating-Bereich
  1517. ⓪#ganz, teilweise oder garnicht im aktuellen Bildschirmfenster (defi-
  1518. ⓪#niert durch ErsteZeile) sichtbar ist.
  1519. ⓪#SOffset gibt an, ob der geaenderte Bereich kuerzer (<0) oder
  1520. ⓪#laenger (>0) geworden ist.
  1521. ⓪#Dieses Verfahren beruht auf einer Idee von Martin Odersky. *)
  1522. ⓪#
  1523. ⓪ VAR  (*$Reg*)y, (*$Reg*)i:                      CARDINAL;
  1524. ⓪%(*$Reg*)zeile:                     CARDINAL;
  1525. ⓪%Help, UntereZeile:         einLinePointer;
  1526. ⓪%(*$Reg*)schreib:                   BOOLEAN;
  1527. ⓪%loesche:                   BOOLEAN;
  1528. ⓪%sta, (*$Reg*)erst:                 CARDINAL;
  1529. ⓪ BEGIN
  1530. ⓪"zeile := Puff^.MerkPunkte [ErsteZeile].zeilpos + 1; (* oberste Schirmzeile *)
  1531. ⓪"IF Anzahl = 0 THEN
  1532. ⓪$(* LoescheBild; *)
  1533. ⓪$loesche := TRUE; schreib := TRUE;
  1534. ⓪$Anzahl := LinesOnScreen;
  1535. ⓪"ELSE loesche := FALSE; schreib := FALSE;
  1536. ⓪'erst := zeile;
  1537. ⓪'SucheZeilenNummer (Puff, Start, sta);
  1538. ⓪'IF sta < erst THEN Start := Puff^.MerkPunkte [ErsteZeile].merkline; END;
  1539. ⓪"END (* IF *);
  1540. ⓪"WITH Puff^ DO
  1541. ⓪$Help := MerkPunkte [ErsteZeile].merkline;
  1542. ⓪$y := 1;
  1543. ⓪$CursorAus;
  1544. ⓪$WHILE (y <= LinesOnScreen) & (Help # NIL) & (0 < Anzahl) DO
  1545. ⓪&IF Start = Help THEN
  1546. ⓪((* Ab dieser Zeile schreiben wir auf den Schirm... *)
  1547. ⓪(schreib := TRUE;
  1548. ⓪ 
  1549. ⓪(IF (SOffset < 0) THEN
  1550. ⓪*(* Zeilen werden geloescht - die untersten Bildschirm-
  1551. ⓪-zeilen muessen nachgetragen werden *)
  1552. ⓪*UntereZeile := MerkPunkte [ErsteZeile].merkline;
  1553. ⓪*i := 0;
  1554. ⓪*(* Suchen der Zeile, die unter dem unteren Rand steht: *)
  1555. ⓪*WHILE (i < CARDINAL (INTEGER (LinesOnScreen) + SOffset)) &
  1556. ⓪0(UntereZeile # NIL) DO
  1557. ⓪,UntereZeile := UntereZeile^.naechste; INC (i);
  1558. ⓪*END (* WHILE *);
  1559. ⓪(END (* IF *);
  1560. ⓪(
  1561. ⓪((* Schirmrest nach oben ziehen *)
  1562. ⓪(WHILE (SOffset < 0) DO
  1563. ⓪*GotoXY (0, y);
  1564. ⓪*WriteChar (escape); WriteChar (linedel); INC (SOffset);
  1565. ⓪*IF UntereZeile # NIL THEN
  1566. ⓪,GotoXY (0, LinesOnScreen);
  1567. ⓪,WriteString (MerkPunkte [ErsteZeile].charpos,
  1568. ⓪9(*ControlZeichen IN Modus, TabFiltern IN Modus,*)
  1569. ⓪9UntereZeile^.ZeilPointer^);
  1570. ⓪,UntereZeile := UntereZeile^.naechste;
  1571. ⓪*END (* IF UntereZeile *);
  1572. ⓪(END (* WHILE *);
  1573. ⓪(
  1574. ⓪((* Schirmrest nach unten stossen *)
  1575. ⓪(WHILE (SOffset > 0) DO
  1576. ⓪*WriteChar (escape); WriteChar (lineins); DEC (SOffset);
  1577. ⓪(END (* WHILE *);
  1578. ⓪&END (* IF Start = Help *);
  1579. ⓪&
  1580. ⓪&IF schreib THEN
  1581. ⓪(GotoXY (0, y);
  1582. ⓪(MakeHighLine (Puff, (*ControlZeichen IN Modus, TabFiltern IN Modus,*)
  1583. ⓪6zeile, Help^.ZeilPointer^);
  1584. ⓪(IF endline + 1 < CharsInLine THEN LoescheZeile; END;
  1585. ⓪*(* GRRRR no one will understand this code... ask me! It's a beautiful side-effect! *)
  1586. ⓪(DEC (Anzahl);
  1587. ⓪&END (* IF schreib *);
  1588. ⓪&INC (y); Help := Help^.naechste;
  1589. ⓪&INC (zeile);
  1590. ⓪$END (* WHILE *);
  1591. ⓪$IF loesche THEN LoescheEndeBild; END;
  1592. ⓪$CursorEin;
  1593. ⓪"END (* WITH *);
  1594. ⓪ END SchirmSchreiben2;
  1595. ⓪ 
  1596. ⓪ 
  1597. ⓪ PROCEDURE SchirmSchreiben (Puff: einPufferPointer; Start: einLinePointer;
  1598. ⓪<Anzahl: CARDINAL; SOffset: INTEGER);
  1599. ⓪"VAR clip: Rectangle;
  1600. ⓪"BEGIN
  1601. ⓪$UpdateWindow (TRUE);
  1602. ⓪$clip:= WindowRectList (WindowHandle, firstElem);
  1603. ⓪$WHILE clip.w # 0 DO
  1604. ⓪&SetClipping (ScreenHandle, clip);
  1605. ⓪&SchirmSchreiben2 (Puff, Start, Anzahl, SOffset);
  1606. ⓪&clip := WindowRectList (WindowHandle, nextElem);
  1607. ⓪$END;
  1608. ⓪$DisableClipping (ScreenHandle);
  1609. ⓪$UpdateWindow (FALSE);
  1610. ⓪"END SchirmSchreiben;
  1611. ⓪ 
  1612. ⓪ (* END EditScreen. *)
  1613. ⓪ 
  1614. ⓪ (************************* EditLine **********************************)
  1615. ⓪ 
  1616. ⓪ VAR     rScreen:        CARDINAL;
  1617. ⓪(d:              ARRAY [0..0] OF CHAR;
  1618. ⓪(x:              CARDINAL;
  1619. ⓪((*ok:             BOOLEAN;*)  (* Weil Screen Funktionen exp. *)
  1620. ⓪(warBlank:       BOOLEAN;  (* SkipBlank *)
  1621. ⓪(switch:         BOOLEAN;  (* SkipBlank *)
  1622. ⓪(control:        BOOLEAN;
  1623. ⓪(Length,
  1624. ⓪(expandedLength: CARDINAL;
  1625. ⓪(bewegt:         BOOLEAN;
  1626. ⓪(Knoepfe:        ButtonSet;
  1627. ⓪(p:              eineZeile;
  1628. ⓪ 
  1629. ⓪ PROCEDURE PufferName ( p0: einPufferPointer; VAR s: ARRAY OF CHAR);
  1630. ⓪ VAR     ok:     BOOLEAN;
  1631. ⓪((*$Reg*) p: einPufferPointer;
  1632. ⓪ BEGIN
  1633. ⓪$p:= p0;
  1634. ⓪$IF    p = AlternEdit       THEN Assign ('<ALTE>', s);
  1635. ⓪$ELSIF p = ClipBoard        THEN Assign ('<CLIP>', s);
  1636. ⓪$ELSIF p = HilfsPuffer      THEN Assign ('<HELP>', s);
  1637. ⓪$ELSIF p = ConfigPuffer     THEN Assign ('<CONF>', s);
  1638. ⓪$ELSIF p = DruckPuff        THEN Assign ('<DRUC>', s);
  1639. ⓪$ELSIF p = FehlerPuffer     THEN Assign ('<FEHL>', s);
  1640. ⓪$ELSIF p = MailPuffer       THEN Assign ('<MAIL>', s);
  1641. ⓪$ELSIF p = GolemPuffer      THEN Assign ('<GOLE>', s);
  1642. ⓪$ELSIF p = SendePuffer      THEN Assign ('<SEND>', s);
  1643. ⓪$ELSIF p = PSCPuffer        THEN Assign ('<PSCP>', s);
  1644. ⓪$ELSIF p = DruckerBatch     THEN Assign ('<DRUC>', s);
  1645. ⓪$(*ELSIF p = TextVergleich    THEN Assign ('<VERG>', s);*)
  1646. ⓪$ELSIF p = WaehlPuffer      THEN Assign ('<WAEH>', s);
  1647. ⓪$ELSIF p = StartPuffer      THEN Assign ('<STAR>', s);
  1648. ⓪$ELSIF p = Puffer1          THEN Assign ('<PUF1>', s);
  1649. ⓪$ELSIF p = Puffer2          THEN Assign ('<PUF2>', s);
  1650. ⓪$ELSIF p = Puffer3          THEN Assign ('<PUF3>', s);
  1651. ⓪$ELSIF p = Puffer4          THEN Assign ('<PUF4>', s);
  1652. ⓪$ELSIF p = LoadPuffer       THEN Assign ('<LOAD>', s);
  1653. ⓪$ELSE                            Assign ('<BASE>', s);
  1654. ⓪"END;
  1655. ⓪ END PufferName;
  1656. ⓪ 
  1657. ⓪ VAR     DummyPuffer:    einPufferPointer;
  1658. ⓪ 
  1659. ⓪ PROCEDURE Prompt (zeile: CARDINAL;
  1660. ⓪1info: ARRAY OF CHAR;
  1661. ⓪1VAR eingabe: ARRAY OF CHAR;
  1662. ⓪1VAR key: einTasteneintrag);
  1663. ⓪ VAR     x:                                              CARDINAL;
  1664. ⓪(overflow, marginoverflow, editiert:             BOOLEAN;
  1665. ⓪(dx, dy:                                         CARDINAL;
  1666. ⓪ BEGIN
  1667. ⓪"IF DummyPuffer = NIL THEN
  1668. ⓪$NEW (DummyPuffer); PuffInit (DummyPuffer);
  1669. ⓪$IF DummyPuffer = NIL THEN
  1670. ⓪&Nachricht ('Kann Dummypuffer|nicht anlegen.900');
  1671. ⓪&(* Eh--- wo ist Liste der Fehlerleitnummern? *)
  1672. ⓪&RETURN;
  1673. ⓪$END;
  1674. ⓪$DummyPuffer^.NaechsterPuffer := DummyPuffer;
  1675. ⓪"END;
  1676. ⓪"x := LENGTH (eingabe);
  1677. ⓪"GotoXY (0, zeile); WriteLine (eingabe); LoescheZeile;
  1678. ⓪"WITH DummyPuffer^ DO
  1679. ⓪$MerkPunkte [LaufendeZeile].zeilpos := zeile;
  1680. ⓪$MerkPunkte [ErsteZeile].zeilpos := 0;
  1681. ⓪$MerkPunkte [ErsteZeile].charpos := 0;
  1682. ⓪$REPEAT
  1683. ⓪&MerkPunkte [LaufendeZeile].charpos := x;
  1684. ⓪&PutLine (MerkPunkte [LaufendeZeile].merkline, eingabe);
  1685. ⓪&Edit (DummyPuffer, eingabe, FALSE, TRUE, info, overflow, marginoverflow,
  1686. ⓪,FALSE, dx, dy, key);
  1687. ⓪&IF (key.TT = Befehl) & ((key.bef = Quit) OR (key.bef = QuitCompile)) THEN
  1688. ⓪(eingabe [0] := nul ; GotoXY (0, zeile); LoescheZeile; x := 0;
  1689. ⓪&END (* IF *);
  1690. ⓪$UNTIL (key.TT = Befehl) &
  1691. ⓪*(key.bef IN Befehlssatz {return, cursup, cursdown});
  1692. ⓪"END (* WITH DummyPuffer *);
  1693. ⓪ END Prompt;
  1694. ⓪ 
  1695. ⓪ PROCEDURE Edit (Puff: einPufferPointer;
  1696. ⓪0VAR s:                  ARRAY OF CHAR;  (* Zu editierende Zeile *)
  1697. ⓪4zeighelp, DoVorlauf: BOOLEAN;        (* Prompt anzeigen *)
  1698. ⓪0VAR info:               ARRAY OF CHAR;  (* aktuelle Information *)
  1699. ⓪0VAR overflow:           BOOLEAN;        (* Zeilenüberlauf *)
  1700. ⓪0VAR marginoverflow:     BOOLEAN;        (* Bildschirmüberlauf *)
  1701. ⓪4exit:               BOOLEAN;
  1702. ⓪0VAR mx, my:             CARDINAL;        (* MausPos vor Tastendruck *)
  1703. ⓪0VAR termch:             einTasteneintrag); (* FunktionsCode,
  1704. ⓪Jmit dem die Zeile abgebrochen wurde *)
  1705. ⓪ 
  1706. ⓪ VAR     z:                      CARDINAL;
  1707. ⓪(lokaleditiert:          BOOLEAN;
  1708. ⓪(ll:                     CARDINAL;
  1709. ⓪(ok:                     BOOLEAN;
  1710. ⓪(starty, xoffset:        CARDINAL;
  1711. ⓪(ZeileGueltig:           BOOLEAN;
  1712. ⓪ 
  1713. ⓪"PROCEDURE InsChar (ch: CHAR);
  1714. ⓪"BEGIN
  1715. ⓪$CursorAus;
  1716. ⓪$IF x >= xoffset THEN
  1717. ⓪&GotoXY (x - xoffset, starty);
  1718. ⓪&WriteString (x, s);
  1719. ⓪&GotoXY (x - xoffset, starty); CursorEin;
  1720. ⓪$END;
  1721. ⓪"END InsChar;
  1722. ⓪"
  1723. ⓪"PROCEDURE DelChar;
  1724. ⓪"BEGIN
  1725. ⓪$CursorAus;
  1726. ⓪$IF x >= xoffset THEN
  1727. ⓪&GotoXY (x - xoffset, starty);
  1728. ⓪&WriteString (x, s);
  1729. ⓪&LoescheZeile;
  1730. ⓪&GotoXY (x - xoffset, starty); CursorEin;
  1731. ⓪$END;
  1732. ⓪"END DelChar;
  1733. ⓪"
  1734. ⓪"PROCEDURE SkipBlank (ch: CHAR): BOOLEAN;
  1735. ⓪"BEGIN
  1736. ⓪$switch := warBlank;
  1737. ⓪$warBlank := warBlank OR (ch IN CharSet {0C..' ',
  1738. ⓪L',', ';', '.', '(',
  1739. ⓪L')', '[', ']', '{', '}',
  1740. ⓪L':', '!', '/', '*', '-',
  1741. ⓪L'+', '&', '~', '=', '^',
  1742. ⓪L'#', '|', '<', '>'});
  1743. ⓪$IF warBlank & (ch # ' ') & switch THEN
  1744. ⓪&warBlank := FALSE;
  1745. ⓪&switch := FALSE;
  1746. ⓪&RETURN FALSE; (* Cursor bleibt stehen *)
  1747. ⓪$ELSE RETURN TRUE; (* Cursor läuft weiter *)
  1748. ⓪$END (* IF *);
  1749. ⓪"END SkipBlank;
  1750. ⓪"
  1751. ⓪"PROCEDURE LiesZeichen (VAR z: einTasteneintrag);
  1752. ⓪"BEGIN
  1753. ⓪$REPEAT
  1754. ⓪&LiesTaste (z);
  1755. ⓪&IF z.TT = Befehl THEN
  1756. ⓪(LoescheQueue;
  1757. ⓪(
  1758. ⓪(IF (z.bef = LeftMous) OR (z.bef = RightMous) THEN
  1759. ⓪(
  1760. ⓪*MausPos (mx, my, bewegt, Knoepfe);
  1761. ⓪*IF (my > CharHeight + CharHeight) & (my < CharHeight * 3) THEN
  1762. ⓪,CASE z.bef OF
  1763. ⓪.LeftMous:     z.bef := Rolldown;|
  1764. ⓪.RightMous:    z.bef := zumDAnf;|
  1765. ⓪,END;
  1766. ⓪*ELSIF (my > ScreenHeight - 3) THEN
  1767. ⓪,CASE z.bef OF
  1768. ⓪.LeftMous:     z.bef := Rollup;|
  1769. ⓪.RightMous:    z.bef := zumDEnde;|
  1770. ⓪,END;
  1771. ⓪*ELSIF (mx < 3) & (xoffset > 0) THEN
  1772. ⓪,CASE z.bef OF
  1773. ⓪.RightMous:    z.bef := RollFLeft;|
  1774. ⓪.LeftMous:     z.bef := RollLeft;|
  1775. ⓪.ELSE;
  1776. ⓪,END;
  1777. ⓪*ELSIF (mx > ScreenWidth - 3) THEN
  1778. ⓪,CASE z.bef OF
  1779. ⓪.RightMous:    z.bef := RollFRight;|
  1780. ⓪.LeftMous:     z.bef := RollRight;|
  1781. ⓪.ELSE;
  1782. ⓪,END;
  1783. ⓪*END (* IF Knoepfe *);
  1784. ⓪(END (* IF bef = Left oder RightMous *);
  1785. ⓪&END (* IF Befehl *);
  1786. ⓪$UNTIL z.TT # keineTaste;
  1787. ⓪"END LiesZeichen;
  1788. ⓪"
  1789. ⓪"VAR     zeilstr:        ARRAY [0..10] OF CHAR;
  1790. ⓪"
  1791. ⓪"PROCEDURE Vorlauf;
  1792. ⓪"CONST   cmaxx =         132; (* ??? *)
  1793. ⓪"VAR     geschrieben:    CARDINAL;
  1794. ⓪*blankend:       ARRAY [0..cmaxx] OF CHAR;
  1795. ⓪*Length, i:           CARDINAL;
  1796. ⓪*pname:          ARRAY [0..5] OF CHAR;
  1797. ⓪"BEGIN
  1798. ⓪$(*TopBox;*)
  1799. ⓪$CursorAus;
  1800. ⓪$GotoXY (0, 0); HighLight;
  1801. ⓪$IF zeighelp THEN
  1802. ⓪&WITH Puff^ DO
  1803. ⓪(PufferName (Puff, pname);
  1804. ⓪(WriteLine (pname);
  1805. ⓪(WriteConst (" ZL: ");                           (* 11 *)
  1806. ⓪(ConvCard (ZeilenAnzahl, 5, zeilstr);           (* 5 *)
  1807. ⓪(WriteLine (zeilstr); WriteChar ('/');          (* 1 *)
  1808. ⓪(ConvCard (MerkPunkte [LaufendeZeile].zeilpos, 5, zeilstr);
  1809. ⓪(WriteLine (zeilstr);                           (* 5 *)
  1810. ⓪(WriteConst (' SP: ');                           (* 5 *)
  1811. ⓪(ConvCard (x + 1, 3, zeilstr);
  1812. ⓪(WriteLine (zeilstr);                           (* 3 *)
  1813. ⓪(geschrieben := 30;
  1814. ⓪(IF OverWrite IN Modus THEN WriteConst (' <Überschr'); INC (geschrieben, 10);
  1815. ⓪(ELSE WriteConst (' <Einfüg');                INC (geschrieben, 8);
  1816. ⓪(END (* IF *);
  1817. ⓪(IF AutoIndent IN Modus THEN WriteConst (' Indent> ');  INC (geschrieben, 9);
  1818. ⓪(ELSE WriteConst ('> ');                      INC (geschrieben, 2);
  1819. ⓪(END (* IF *);
  1820. ⓪&END (* WITH Puff^ *);
  1821. ⓪$ELSE geschrieben := 0;
  1822. ⓪$END (* IF *);
  1823. ⓪$geschrieben := CharsInLine - geschrieben;
  1824. ⓪$Length := LENGTH (info);
  1825. ⓪$WriteLine (info);
  1826. ⓪$IF Length > geschrieben THEN info [geschrieben] := nul; blankend [0] := nul;
  1827. ⓪$ELSE WriteConst (Strings.Space (geschrieben - Length));
  1828. ⓪$END;
  1829. ⓪$Normal;
  1830. ⓪"END Vorlauf;
  1831. ⓪ 
  1832. ⓪ BEGIN (* Edit *)
  1833. ⓪"WITH Puff^ DO
  1834. ⓪$x := MerkPunkte [LaufendeZeile].charpos;
  1835. ⓪$xoffset := MerkPunkte [ErsteZeile].charpos;
  1836. ⓪$IF ((xoffset > x) OR
  1837. ⓪&(xoffset + rScreen < x)) THEN
  1838. ⓪&marginoverflow := TRUE; RETURN;
  1839. ⓪$END (* IF *);
  1840. ⓪$overflow := FALSE; lokaleditiert := FALSE;
  1841. ⓪$marginoverflow := FALSE;
  1842. ⓪#
  1843. ⓪$IF DoVorlauf THEN
  1844. ⓪&Vorlauf;
  1845. ⓪$END;
  1846. ⓪$starty := MerkPunkte [LaufendeZeile].zeilpos -
  1847. ⓪&MerkPunkte [ErsteZeile].zeilpos;
  1848. ⓪$ZeileGueltig := FALSE;
  1849. ⓪$
  1850. ⓪$LOOP
  1851. ⓪&IF zeighelp THEN
  1852. ⓪(CursorAus; HighLight;
  1853. ⓪(IF ~DoVorlauf THEN
  1854. ⓪*ConvCard (MerkPunkte [LaufendeZeile].zeilpos, 5, zeilstr);
  1855. ⓪*GotoXY (17, 0); WriteLine (zeilstr);
  1856. ⓪(END;
  1857. ⓪(GotoXY (27, 0);
  1858. ⓪(ConvCard (x + 1, 3, zeilstr);
  1859. ⓪(WriteLine (zeilstr);
  1860. ⓪(Normal;
  1861. ⓪&END (* IF zeighelp *);
  1862. ⓪&IF x >= xoffset THEN
  1863. ⓪(GotoXY (x - xoffset, starty);
  1864. ⓪&ELSE GotoXY (0, starty);
  1865. ⓪&END;
  1866. ⓪&CursorEin;
  1867. ⓪&LiesZeichen (termch);
  1868. ⓪&IF (termch.TT = Befehl) & ~(termch.bef IN Befehlssatz
  1869. ⓪({InsertBlank, tabulator, DelLChar, DelRChar, DelLWort, DelRWort,
  1870. ⓪)ZeilAnf, ZeilEnde, DelBZeil, DelEZeil, Wortleft, Wortrigt,
  1871. ⓪)cursleft, cursright})
  1872. ⓪(THEN EXIT
  1873. ⓪(ELSIF ~ZeileGueltig THEN
  1874. ⓪*GetLine (MerkPunkte [LaufendeZeile].merkline, s);
  1875. ⓪*Length := LENGTH (s);
  1876. ⓪*ZeileGueltig := TRUE;
  1877. ⓪&END (* IF *);
  1878. ⓪&
  1879. ⓪&IF (x > Length) & ((termch.TT = Zeichen) OR
  1880. ⓪(((termch.TT = Befehl) &
  1881. ⓪)(termch.bef IN Befehlssatz {CutToClipboard, CopyToClipboard, DelLChar,
  1882. ⓪FInsertBlank})))
  1883. ⓪(THEN
  1884. ⓪(IF (x + 1 < HIGH (s)) THEN
  1885. ⓪*FOR ll := Length TO x - 1 DO
  1886. ⓪,s [ll] := ' ';
  1887. ⓪*END (* FOR *);
  1888. ⓪*Length := x;
  1889. ⓪*s [x] := nul;
  1890. ⓪(END (* IF x < HIGH *);
  1891. ⓪&END (* IF auffuellen *);
  1892. ⓪#
  1893. ⓪&IF (termch.TT = Zeichen) THEN
  1894. ⓪(IF (x + 1 < HIGH (s)) THEN
  1895. ⓪*lokaleditiert := TRUE; INC (AutoCount);
  1896. ⓪*IF (OverWrite IN Modus) & ~(s [x] = tab) THEN
  1897. ⓪,IF (x + 1) > Length THEN s [x + 1] := nul;
  1898. ⓪,END (* IF *);
  1899. ⓪,s [x] := termch.zch;
  1900. ⓪,InsChar (termch.zch);
  1901. ⓪*ELSE
  1902. ⓪,d [0] := termch.zch;
  1903. ⓪,Insert (d, x, s);
  1904. ⓪,InsChar (termch.zch); INC (Length);
  1905. ⓪*END (* IF overwrite *);
  1906. ⓪*INC (x);
  1907. ⓪*IF (Length  >= cZeile ) OR (Length >= HIGH (s)) THEN
  1908. ⓪,overflow := TRUE;
  1909. ⓪*END (* IF *);
  1910. ⓪(ELSE exit := TRUE;
  1911. ⓪(END; (* IF (x < HIGH (s)) *)
  1912. ⓪&ELSIF termch.TT = Befehl THEN
  1913. ⓪(IF (x > Length) & ~(termch.bef IN Befehlssatz {
  1914. ⓪>cursup, cursdown, cursright, cursleft,
  1915. ⓪>Seitup, Seitdown, ZeilEnde, ZeilAnf,
  1916. ⓪>insert, indent, Einrueck, LeftMous, RightMous,
  1917. ⓪>Rollup, Rolldown, home})
  1918. ⓪(THEN x := Length;
  1919. ⓪(END (* IF *);
  1920. ⓪(
  1921. ⓪"
  1922. ⓪(CASE termch.bef OF
  1923. ⓪*InsertBlank: IF (x + 1 < HIGH (s)) THEN
  1924. ⓪9lokaleditiert := TRUE; INC (AutoCount);
  1925. ⓪9d [0] := ' '; Insert (d, x, s);
  1926. ⓪9InsChar (termch.zch); INC (Length);
  1927. ⓪9INC (x);
  1928. ⓪9IF (Length >= cZeile) OR (Length >= HIGH (s)) THEN
  1929. ⓪;overflow := TRUE;
  1930. ⓪9END;
  1931. ⓪7END (* IF (x + 1... *)
  1932. ⓪7|
  1933. ⓪*tabulator: z := TabWeite * ((x DIV TabWeite) + 1);
  1934. ⓪5IF ~(OverWrite IN Modus) THEN
  1935. ⓪7lokaleditiert := TRUE; INC (AutoCount);
  1936. ⓪7d [0] := ' ';
  1937. ⓪7WHILE (x < cZeile) & (Length + 1 < HIGH (s)) & (x < z) DO
  1938. ⓪9Insert (d, x, s);
  1939. ⓪9INC (x); INC (Length);
  1940. ⓪7END (* WHILE *);
  1941. ⓪7CursorAus; GotoXY (0, starty); (* LoescheZeile; *)
  1942. ⓪7WriteString (xoffset, s); LoescheZeile;
  1943. ⓪5ELSE (* overwrite *)
  1944. ⓪7IF s [x] = tab THEN
  1945. ⓪9IF (x <= cZeile) THEN
  1946. ⓪;INC (x);
  1947. ⓪9ELSE exit := TRUE;
  1948. ⓪9END (* IF *);
  1949. ⓪7ELSE
  1950. ⓪9IF (z <= cZeile) THEN
  1951. ⓪;IF z < Length THEN
  1952. ⓪=WHILE (x < cZeile) & (Length + 1 < HIGH (s))
  1953. ⓪C& (x < z) DO
  1954. ⓪?INC (x); INC (Length);
  1955. ⓪=END (* WHILE *);
  1956. ⓪;ELSE
  1957. ⓪=IF TabFiltern IN Modus THEN d [0] := ' '
  1958. ⓪=ELSE d [0] := tab;
  1959. ⓪=END;
  1960. ⓪=x := Length; (* Am Ende einfügen... *)
  1961. ⓪=WHILE (x < cZeile) & (Length + 1 < HIGH (s))
  1962. ⓪C& (x < z) DO
  1963. ⓪?Insert (d, x, s); INC (x);
  1964. ⓪?INC (Length);
  1965. ⓪=END (* WHILE *);
  1966. ⓪;END (* IF Length *);
  1967. ⓪9ELSE exit := TRUE;
  1968. ⓪9END (* IF *);
  1969. ⓪7END (* IF tabulator *);
  1970. ⓪5END (* IF ~overwrite *);
  1971. ⓪5|
  1972. ⓪*DelLChar:  lokaleditiert := TRUE; INC (AutoCount);
  1973. ⓪5IF x > 0 THEN
  1974. ⓪7DEC (x);
  1975. ⓪7IF ~(OverWrite IN Modus) THEN
  1976. ⓪9Delete (s, x, 1); DelChar;
  1977. ⓪7END (* IF *);
  1978. ⓪5ELSE exit := TRUE;
  1979. ⓪5END (* IF *)|
  1980. ⓪*DelRChar:  lokaleditiert := TRUE; INC (AutoCount);
  1981. ⓪5IF LENGTH (s) > x THEN Delete (s, x, 1);
  1982. ⓪LDelChar;
  1983. ⓪5ELSE exit := TRUE;
  1984. ⓪5END;|
  1985. ⓪*DelRWort:  lokaleditiert := TRUE; INC (AutoCount);
  1986. ⓪5exit := exit OR (LENGTH (s) <= x);
  1987. ⓪5(* !!! Length in Schleife !!! *)
  1988. ⓪5warBlank := FALSE; switch := FALSE;
  1989. ⓪5WHILE (LENGTH (s) > x) & SkipBlank (s [x]) DO
  1990. ⓪7Delete (s, x, 1);
  1991. ⓪5END (* WHILE *);
  1992. ⓪5CursorAus;
  1993. ⓪5GotoXY (0, starty); LoescheZeile;
  1994. ⓪5WriteString (xoffset, s);|
  1995. ⓪*DelLWort:  lokaleditiert := TRUE; INC (AutoCount);
  1996. ⓪5(* !!! Length in Schleife !!! *)
  1997. ⓪5IF (x > 0) THEN
  1998. ⓪7warBlank := FALSE; switch := FALSE;
  1999. ⓪7WHILE (x > 0) & SkipBlank (s [x - 1]) DO
  2000. ⓪9Delete (s, x - 1, 1);
  2001. ⓪9DEC (x);
  2002. ⓪7END (* WHILE *);
  2003. ⓪7CursorAus;
  2004. ⓪7GotoXY (0, starty); LoescheZeile;
  2005. ⓪7WriteString (xoffset, s);
  2006. ⓪5ELSE exit := TRUE;
  2007. ⓪5END;|
  2008. ⓪*ZeilAnf:   exit := exit OR (x = 0);
  2009. ⓪5x := 0;|
  2010. ⓪*ZeilEnde:  exit := exit OR (x = Length);
  2011. ⓪5x := Length;|
  2012. ⓪*DelBZeil:  exit := exit OR (x = 0);
  2013. ⓪5lokaleditiert := TRUE; INC (AutoCount);
  2014. ⓪5IF (x > 0) THEN
  2015. ⓪7Copy (s, 0, x, p);
  2016. ⓪7IF undone THEN
  2017. ⓪9Loeschen (UndoPuffer); undone := FALSE;
  2018. ⓪7END;
  2019. ⓪7InsertLine (UndoPuffer, p, FALSE, FALSE, TRUE);
  2020. ⓪7FOR z := 0 TO x - 1 DO
  2021. ⓪9Delete (s, 0, 1);
  2022. ⓪7END (* FOR *);
  2023. ⓪7x := 0;
  2024. ⓪7CursorAus;
  2025. ⓪7GotoXY (0, starty); LoescheZeile;
  2026. ⓪7WriteString (xoffset, s);
  2027. ⓪5END (* IF *);|
  2028. ⓪*DelEZeil:  exit := exit OR (x = Length);
  2029. ⓪5IF ~exit THEN
  2030. ⓪7Copy (s, x, Length - 1, p);
  2031. ⓪7IF undone THEN
  2032. ⓪9Loeschen (UndoPuffer); undone := FALSE;
  2033. ⓪7END;
  2034. ⓪7InsertLine (UndoPuffer, p, FALSE, FALSE, TRUE);
  2035. ⓪5END (* IF *);
  2036. ⓪5s [x] := nul; LoescheZeile;
  2037. ⓪5lokaleditiert := TRUE; INC (AutoCount);|
  2038. ⓪*Wortleft:  IF (x > 0) THEN
  2039. ⓪6warBlank := FALSE; switch := FALSE;
  2040. ⓪6WHILE (x > 0) &
  2041. ⓪8SkipBlank (s [x - 1]) DO
  2042. ⓪8DEC (x);
  2043. ⓪6END (* WHILE *);
  2044. ⓪5ELSE exit := TRUE;
  2045. ⓪5END (* IF *)|
  2046. ⓪*Wortrigt:  IF (x <= cZeile) &
  2047. ⓪8(x + 1 <= Length)
  2048. ⓪5THEN
  2049. ⓪:warBlank := FALSE; switch := FALSE;
  2050. ⓪:WHILE (x <= cZeile) &
  2051. ⓪@(x + 1 <= Length) &
  2052. ⓪@(SkipBlank (s [x])) DO
  2053. ⓪DINC (x);
  2054. ⓪:END (* WHILE *);
  2055. ⓪5ELSE exit := TRUE;
  2056. ⓪5END (* IF *)|
  2057. ⓪*cursleft:  IF x > 0 THEN DEC (x);
  2058. ⓪5ELSE exit := TRUE;
  2059. ⓪5END (* IF *)|
  2060. ⓪*cursright: IF (x <= cZeile) THEN
  2061. ⓪7INC (x);
  2062. ⓪5ELSE exit := TRUE;
  2063. ⓪5END (* IF *)|
  2064. ⓪*ELSE;
  2065. ⓪(END (* CASE sc *);
  2066. ⓪((*IF ~exit THEN termch.TT := keineTaste; END;*)
  2067. ⓪&END (* IF..ELSE *);
  2068. ⓪&Length := LENGTH (s);
  2069. ⓪&IF lokaleditiert & ((Length >= cZeile ) OR (Length >= HIGH (s))) THEN
  2070. ⓪(overflow := TRUE;
  2071. ⓪&END (* IF *);
  2072. ⓪&IF ((xoffset > x) OR
  2073. ⓪*(xoffset + rScreen < x)) THEN
  2074. ⓪(marginoverflow := TRUE;
  2075. ⓪&END (* IF *);
  2076. ⓪$(*UNTIL exit OR overflow OR marginoverflow;*)
  2077. ⓪&IF overflow OR marginoverflow OR exit THEN EXIT; END;
  2078. ⓪$END (* LOOP *);
  2079. ⓪$MerkPunkte [LaufendeZeile].charpos := x;
  2080. ⓪$IF lokaleditiert THEN INCL (Modus, Changed); END;
  2081. ⓪"END (* WITH Puff^ *);
  2082. ⓪ END Edit;
  2083. ⓪ 
  2084. ⓪ (* ENDE EditLine *)
  2085. ⓪ 
  2086. ⓪ 
  2087. ⓪ BEGIN (* GMEKernel *)
  2088. ⓪"Trace ('GMEKernel');
  2089. ⓪"tabjump := cTabWeite;
  2090. ⓪ 
  2091. ⓪ (* BEGIN EditLine *)
  2092. ⓪ 
  2093. ⓪"Trace ('EditLine');
  2094. ⓪"warBlank := FALSE; switch := FALSE;
  2095. ⓪"rScreen := CharsInLine - 1;
  2096. ⓪ (* END EditLine. *)
  2097. ⓪ 
  2098. ⓪ END GMEKernel.
  2099. ⓪ 
  2100. ⓪ ə
  2101. (* $FFEE7E1E$FFEE7E1E$FFEE7E1E$FFEE7E1E$FFEE7E1E$FFEE7E1E$FFEE7E1E$FFEE7E1E$FFEE7E1E$FFEE7E1E$FFEE7E1E$FFEE7E1E$FFEE7E1E$FFEE7E1E$FFEE7E1E$00000AD1$FFEE7E1E$FFEE7E1E$FFEE7E1E$FFEE7E1E$FFEE7E1E$FFEE7E1E$FFEE7E1E$FFEE7E1E$FFEE7E1E$FFEE7E1E$FFEE7E1E$FFEE7E1E$FFEE7E1E$FFEE7E1E$FFEE7E1E$FFEE7E1E$FFEE7E1E$FFEE7E1E$FFEE7E1E$FFEE7E1E$FFEE7E1E$FFEE7E1E$FFEE7E1E$FFEE7E1E$FFEE7E1E$FFEE7E1EÇ$0000C8BAT.......T.......T.......T.......T.......T.......T.......T.......T.......T.......$00000426$00000436$0000C81E$0000C826$0000045B$0000C841$0000C92B$0000C89F$00000506$0000C8BA$000003CC$FFED0748$000003DA$000003EA$000003FE$00000419¿Çé*)
  2102.